ZGlmZiAtLWdpdCBhL2RvY3MvaW50ZWdyYXRpb25fZ3VpZGUvdGZtX2ludGVncmF0aW9uX2d1aWRlLnJzdCBiL2RvY3MvaW50ZWdyYXRpb25fZ3VpZGUvdGZtX2ludGVncmF0aW9uX2d1aWRlLnJzdAppbmRleCBjM2Y4YTZiLi45YzFlY2ZhIDEwMDY0NAotLS0gYS9kb2NzL2ludGVncmF0aW9uX2d1aWRlL3RmbV9pbnRlZ3JhdGlvbl9ndWlkZS5yc3QKKysrIGIvZG9jcy9pbnRlZ3JhdGlvbl9ndWlkZS90Zm1faW50ZWdyYXRpb25fZ3VpZGUucnN0CkBAIC0zNyw2ICszNyw3IEBACiAtIG5SRjkxNjAgREsgKENvcnRleC1NMzMpCiAtIG5SRjUzNDAgREsgKENvcnRleC1NMzMgQXBwbGljYXRpb24gTUNVKQogLSBCTDUzNDAgRFZLIChDb3J0ZXgtTTMzIEFwcGxpY2F0aW9uIE1DVSkKKy0gQ29yc3RvbmUtUG9sYXJpcyBFdGhvcy1VNTUgRlZQIChPbHltcHVzIENQVSBwbHVzIEV0aG9zLVU1NSkKIAogVGhlIGZpbGVzIHJlbGF0ZWQgdG8gdGhlIHN1cHBvcnRlZCBwbGF0Zm9ybXMgYXJlIGNvbnRhaW5lZCB1bmRlciB0aGUKIGBgcGxhdGZvcm1gYCBzdWJmb2xkZXIuIFRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmaWxlcyBhcmUgdW5kZXIKZGlmZiAtLWdpdCBhL2RvY3MvdGVjaG5pY2FsX3JlZmVyZW5jZXMvZGVzaWduX2RvY3MvdGZtX3NlY3VyZV9ib290LnJzdCBiL2RvY3MvdGVjaG5pY2FsX3JlZmVyZW5jZXMvZGVzaWduX2RvY3MvdGZtX3NlY3VyZV9ib290LnJzdAppbmRleCBjNmY1NDA3Li5jNmU5MzllIDEwMDY0NAotLS0gYS9kb2NzL3RlY2huaWNhbF9yZWZlcmVuY2VzL2Rlc2lnbl9kb2NzL3RmbV9zZWN1cmVfYm9vdC5yc3QKKysrIGIvZG9jcy90ZWNobmljYWxfcmVmZXJlbmNlcy9kZXNpZ25fZG9jcy90Zm1fc2VjdXJlX2Jvb3QucnN0CkBAIC0yMzQsNiArMjM0LDggQEAKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKIHwgRlZQX1NTRTMwMF9NUFMzICAgICB8IE5vICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBZZXMgICAgICB8IFllcyAgICAgICAgICAgIHwgTm8gICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKK3wgQ29yc3RvbmUtUG9sYXJpcyAgICB8IE5PICAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBZZXMgICAgICB8IFllcyAgICAgICAgICAgIHwgTm8gICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKIHwgTFBDNTVTNjkgICAgICAgICAgICB8IFllcyAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBObyAgICAgICB8IFllcyAgICAgICAgICAgIHwgTm8gICAgICAgICAgIHwKICstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKIHwgTXVzY2EtQjEgICAgICAgICAgICB8IFllcyAgICAgICAgICAgICB8IFllcyAgICAgICAgICAgfCBZZXMgICAgICB8IFllcyAgICAgICAgICAgIHwgTm8gICAgICAgICAgIHwKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC9wbGF0Zm9ybV9pbnRyb2R1Y3Rpb24ucnN0IGIvcGxhdGZvcm0vZXh0L3BsYXRmb3JtX2ludHJvZHVjdGlvbi5yc3QKaW5kZXggZWVjMzMyOC4uZWJiMDZjMCAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vZXh0L3BsYXRmb3JtX2ludHJvZHVjdGlvbi5yc3QKKysrIGIvcGxhdGZvcm0vZXh0L3BsYXRmb3JtX2ludHJvZHVjdGlvbi5yc3QKQEAgLTIsNiArMiwxMCBAQAogUGxhdGZvcm1zIGludHJvZHVjdGlvbgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisgICAgLSBPbHltcHVzIHN5c3RlbQorCisgICAgICAgIC0gQ29yc3RvbmUtUG9sYXJpcyBFdGhvcy1VNTUgRlZQIChPbHltcHVzIENQVSBwbHVzIEV0aG9zLVU1NSkKKwogICAgIC0gQ29ydGV4LU01NSBzeXN0ZW06CiAKICAgICAgICAgLSBgRlBHQSBpbWFnZSBsb2FkZWQgb24gTVBTMyBib2FyZCAoQU41NDcpLgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL0NNYWtlTGlzdHMudHh0IGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhN2QzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxODcgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvcHlyaWdodCAoYykgMjAyMC0yMDIxLCBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY21ha2VfcG9saWN5KFNFVCBDTVAwMDc2IE5FVykKK3NldChDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVIgJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT0gUGxhdGZvcm0gcmVnaW9uIGRlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKwordGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMocGxhdGZvcm1fcmVnaW9uX2RlZnMKKyAgICBJTlRFUkZBQ0UKKyAgICAgICAgcGFydGl0aW9uCispCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09IFBsYXRmb3JtIGNvbW1vbiBkZWZzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCisKK2lmICgke0NNQUtFX0NfQ09NUElMRVJfSUR9IFNUUkVRVUFMIElBUikKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJJQVIgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgb24gdGhlIG1wczMvY29yc3RvbmVfcG9sYXJpcyBkdWUgdG8gYSBsYWNrIG9mIHNjYXR0ZXIgZmlsZXMiKQorZW5kaWYoKQorCitpZiAoJHtDTUFLRV9DX0NPTVBJTEVSX0lEfSBTVFJFUVVBTCBBUk1DbGFuZykKKyAgICBpZiAoJHtDTUFLRV9DX0NPTVBJTEVSX1ZFUlNJT059IFZFUlNJT05fTEVTUyAiNi4xNCIpCisgICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkFyY2hpdGVjdHVyZSAoQXJtdjguMS1NKSBpcyBvbmx5IHN1cHBvcnRlZCBpbiBBUk1DTEFORyB2ZXJzaW9uIDYuMTQgb3IgbmV3ZXIuIikKKyAgICBlbmRpZigpCitlbmRpZigpCisKKyMgU3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgcGxhdGZvcm0gc3BlY2lmaWMgYnVpbGQgZGVwZW5kZW5jaWVzLgordGFyZ2V0X3NvdXJjZXModGZtX3MKKyAgICBQUklWQVRFCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RldmljZS9zb3VyY2Uvc3RhcnR1cF9jb3JzdG9uZV9wb2xhcmlzX3MuYworKQordGFyZ2V0X2FkZF9zY2F0dGVyX2ZpbGUodGZtX3MKKyAgICAkPCQ8Q19DT01QSUxFUl9JRDpBUk1DbGFuZz46JHtDTUFLRV9TT1VSQ0VfRElSfS9wbGF0Zm9ybS9leHQvY29tbW9uL2FybWNsYW5nL3RmbV9jb21tb25fcy5zY3Q+CisgICAgJDwkPENfQ09NUElMRVJfSUQ6R05VPjoke0NNQUtFX1NPVVJDRV9ESVJ9L3BsYXRmb3JtL2V4dC9jb21tb24vZ2NjL3RmbV9jb21tb25fcy5sZD4KKykKKworaWYoTlMpCisgICAgdGFyZ2V0X3NvdXJjZXModGZtX25zCisgICAgICAgIFBSSVZBVEUKKyAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19ucy5jCisgICAgKQorICAgIHRhcmdldF9hZGRfc2NhdHRlcl9maWxlKHRmbV9ucworICAgICAgICAkPCQ8Q19DT01QSUxFUl9JRDpBUk1DbGFuZz46JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RldmljZS9zb3VyY2UvYXJtY2xhbmcvY29yc3RvbmVfcG9sYXJpc19ucy5zY3Q+CisgICAgICAgICQ8JDxDX0NPTVBJTEVSX0lEOkdOVT46JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RldmljZS9zb3VyY2UvZ2NjL2NvcnN0b25lX3BvbGFyaXNfbnMubGQ+CisgICAgKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhDTVNJU181X3RmbV9ucworICAgICAgICBJTlRFUkZBQ0UKKyAgICAgICAgICAgIENNU0lTXzVfUlRYX1Y4TU1OCisgICAgKQorZW5kaWYoKQorCitpZihCTDIpCisgICAgdGFyZ2V0X3NvdXJjZXMoYmwyCisgICAgICAgIFBSSVZBVEUKKyAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19ibDIuYworICAgICkKKyAgICB0YXJnZXRfYWRkX3NjYXR0ZXJfZmlsZShibDIKKyAgICAgICAgICAgICQ8JDxDX0NPTVBJTEVSX0lEOkFSTUNsYW5nPjoke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGV2aWNlL3NvdXJjZS9hcm1jbGFuZy9jb3JzdG9uZV9wb2xhcmlzX2JsMi5zY3Q+CisgICAgICAgICAgICAkPCQ8Q19DT01QSUxFUl9JRDpHTlU+OiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kZXZpY2Uvc291cmNlL2djYy9jb3JzdG9uZV9wb2xhcmlzX2JsMi5sZD4KKyAgICApCitlbmRpZigpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09IFBsYXRmb3JtIFNlY3VyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCisKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHBsYXRmb3JtX3MKKyAgICBQVUJMSUMKKyAgICAgICAgLgorICAgICAgICAuLi9jb21tb24KKyAgICAgICAgY21zaXNfZHJpdmVycworICAgICAgICBjbXNpc19kcml2ZXJzL2NvbmZpZworICAgICAgICBkZXZpY2UKKyAgICAgICAgZGV2aWNlL2NvbmZpZworICAgICAgICBkZXZpY2UvaW5jbHVkZQorICAgICAgICBkZXZpY2Uvc291cmNlL2FybWNsYW5nCisgICAgICAgIG5hdGl2ZV9kcml2ZXJzCisgICAgICAgIHBhcnRpdGlvbgorICAgICAgICBzZXJ2aWNlcy9zcmMKKyAgICAgICAgJHtQTEFURk9STV9ESVJ9Ly4uCispCisKK3RhcmdldF9zb3VyY2VzKHBsYXRmb3JtX3MKKyAgICBQUklWQVRFCisgICAgICAgIGNtc2lzX2RyaXZlcnMvRHJpdmVyX0ZsYXNoLmMKKyAgICAgICAgY21zaXNfZHJpdmVycy9Ecml2ZXJfTVBDLmMKKyAgICAgICAgY21zaXNfZHJpdmVycy9Ecml2ZXJfUFBDLmMKKyAgICAgICAgY21zaXNfZHJpdmVycy9Ecml2ZXJfVVNBUlQuYworICAgICAgICBkZXZpY2Uvc291cmNlL2RldmljZV9kZWZpbml0aW9uLmMKKyAgICAgICAgZGV2aWNlL3NvdXJjZS9zeXN0ZW1fY29yZV9pbml0LmMKKyAgICAgICAgbmF0aXZlX2RyaXZlcnMvbXBjX3NpZV9kcnYuYworICAgICAgICBuYXRpdmVfZHJpdmVycy9tcHVfYXJtdjhtX2Rydi5jCisgICAgICAgIG5hdGl2ZV9kcml2ZXJzL3BwY19wb2xhcmlzX2Rydi5jCisgICAgICAgIG5hdGl2ZV9kcml2ZXJzL3N5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuYworICAgICAgICBuYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5jCisgICAgICAgIHNwbV9oYWwuYworICAgICAgICB0Zm1faW50ZXJydXB0cy5jCisgICAgICAgIHRhcmdldF9jZmcuYworICAgICAgICB0Zm1faGFsX2lzb2xhdGlvbi5jCisgICAgICAgIHRmbV9oYWxfcGxhdGZvcm0uYworICAgICAgICAke0NNQUtFX1NPVVJDRV9ESVJ9L3BsYXRmb3JtL2V4dC9jb21tb24vdGZtX2hhbF9udmljLmMKKyAgICAgICAgJHtDTUFLRV9TT1VSQ0VfRElSfS9wbGF0Zm9ybS9leHQvY29tbW9uL3RmbV9oYWxfaXNvbGF0aW9uX21wdV92OG0uYworICAgICAgICAkPCQ8T1I6JDxCT09MOiR7VEVTVF9OU19TTElIX0lSUX0+LCQ8Qk9PTDoke1RFU1RfTlNfRkxJSF9JUlF9Pj46JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3BsYXRfdGVzdC5jPgorICAgICAgICAkPCQ8Qk9PTDoke1RGTV9QQVJUSVRJT05fUExBVEZPUk19Pjoke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc2VydmljZXMvc3JjL3RmbV9wbGF0Zm9ybV9zeXN0ZW0uYz4KKykKKwordGFyZ2V0X3NvdXJjZXModGZtX3NwcnQKKyAgICBQUklWQVRFCisgICAgICAgICMgU0xJSCB0ZXN0IFBhcnRpdGlvbiBhbmQgRkxJSCB0ZXN0IFBhcnRpdGlvbiBhY2Nlc3MgdGhlIHRpbWVyIGFzIEFSb1QgUGFydGl0aW9ucy4KKyAgICAgICAgIyBQdXQgdGhlIGRyaXZlciB0byBTUFJUIHNvIHRoYXQgYm90aCBTTElIIGFuZCBGTElIIHRlc3RzIGNhbiBhY2Nlc3MgaXQuCisgICAgICAgICQ8JDxPUjokPEJPT0w6JHtURVNUX05TX1NMSUhfSVJRfT4sJDxCT09MOiR7VEVTVF9OU19GTElIX0lSUX0+Pjoke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbmF0aXZlX2RyaXZlcnMvc3lzdGltZXJfYXJtdjgtbV9kcnYuYz4KKykKKwordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsYXRmb3JtX3MKKyAgICBQUklWQVRFCisgICAgICAgIHRmbV91dGlsaXRpZXMKKykKKwordGFyZ2V0X2NvbXBpbGVfb3B0aW9ucyhwbGF0Zm9ybV9zCisgICAgUFVCTElDCisgICAgICAgICR7Q09NUElMRVJfQ01TRV9GTEFHfQorKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PSBQbGF0Zm9ybSBOb24tU2VjdXJlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IworCit0YXJnZXRfc291cmNlcyhwbGF0Zm9ybV9ucworICAgIFBSSVZBVEUKKyAgICAgICAgY21zaXNfZHJpdmVycy9Ecml2ZXJfRmxhc2guYworICAgICAgICBjbXNpc19kcml2ZXJzL0RyaXZlcl9VU0FSVC5jCisgICAgICAgIGRldmljZS9zb3VyY2UvZGV2aWNlX2RlZmluaXRpb24uYworICAgICAgICBkZXZpY2Uvc291cmNlL3N5c3RlbV9jb3JlX2luaXQuYworICAgICAgICBuYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5jCispCisKK3RhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKHBsYXRmb3JtX25zCisgICAgUFVCTElDCisgICAgICAgIC4KKyAgICAgICAgLi4vY29tbW9uCisgICAgICAgICR7UExBVEZPUk1fRElSfS8uLgorICAgICAgICBjbXNpc19kcml2ZXJzCisgICAgICAgIGNtc2lzX2RyaXZlcnMvY29uZmlnCisgICAgICAgIGRldmljZQorICAgICAgICBkZXZpY2UvY29uZmlnCisgICAgICAgIGRldmljZS9pbmNsdWRlCisgICAgICAgIGRldmljZS9zb3VyY2UvYXJtY2xhbmcKKyAgICAgICAgbmF0aXZlX2RyaXZlcnMKKyAgICAgICAgcGFydGl0aW9uCispCisKKyMgVE9ETzogRm9yIHNvbWUgcmVhc29uIHRoaXMgaXMgbmVlZGVkCit0YXJnZXRfbGlua19saWJyYXJpZXMocGxhdGZvcm1fbnMKKyAgICBQUklWQVRFCisgICAgICAgIHBzYV9pbnRlcmZhY2UKKykKKworIz09PT09PT09PT09PT09PT09PT09PT09PT0gUGxhdGZvcm0gQkwyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKworaWYoQkwyKQorICAgIHRhcmdldF9zb3VyY2VzKHBsYXRmb3JtX2JsMgorICAgICAgICBQUklWQVRFCisgICAgICAgICAgICBjbXNpc19kcml2ZXJzL0RyaXZlcl9GbGFzaC5jCisgICAgICAgICAgICBjbXNpc19kcml2ZXJzL0RyaXZlcl9VU0FSVC5jCisgICAgICAgICAgICBkZXZpY2Uvc291cmNlL2RldmljZV9kZWZpbml0aW9uLmMKKyAgICAgICAgICAgIGRldmljZS9zb3VyY2Uvc3lzdGVtX2NvcmVfaW5pdC5jCisgICAgICAgICAgICBuYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5jCisgICAgICAgICAgICBib290X2hhbC5jCisgICAgKQorCisgICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMocGxhdGZvcm1fYmwyCisgICAgICAgIFBVQkxJQworICAgICAgICAgICAgY21zaXNfZHJpdmVycworICAgICAgICAgICAgY21zaXNfZHJpdmVycy9jb25maWcKKyAgICAgICAgICAgIGRldmljZQorICAgICAgICAgICAgZGV2aWNlL2NvbmZpZworICAgICAgICAgICAgZGV2aWNlL2luY2x1ZGUKKyAgICAgICAgICAgIGRldmljZS9zb3VyY2UvYXJtY2xhbmcKKyAgICAgICAgICAgIG5hdGl2ZV9kcml2ZXJzCisgICAgICAgICAgICBwYXJ0aXRpb24KKyAgICAgICAgICAgIHNlcnZpY2VzL3NyYworCisgICAgICAgIFBSSVZBVEUKKyAgICAgICAgICAgIC4KKyAgICAgICAgICAgICR7UExBVEZPUk1fRElSfS8uLgorICAgICAgICAgICAgbmF0aXZlX2RyaXZlcnMKKyAgICApCitlbmRpZigpCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvUkVBRE1FLnJzdCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9SRUFETUUucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDVkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvUkVBRE1FLnJzdApAQCAtMCwwICsxLDIxIEBACitDb3JzdG9uZS1Qb2xhcmlzCis9PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK0NvcnN0b25lLVBvbGFyaXMgaXMgYW4gQXJtIHJlZmVyZW5jZSBzdWJzeXN0ZW0gZm9yIHNlY3VyZSBTeXN0ZW0gb24KK0NoaXBzIGNvbnRhaW5pbmcgYW4gQXJtdjguMS1NIE9seW1wdXMgcHJvY2Vzc29yIGFuZCBhbiBFdGhvcy1VNTUgbmV1cmFsCituZXR3b3JrIHByb2Nlc3Nvci4gSXQgaXMgYW4gTVBTMyBiYXNlZCBwbGF0Zm9ybSB3aXRoIHRoZSB1c3VhbCBNUFMzCitwZXJpcGhlcmFscy4KKworVGhpcyBwbGF0Zm9ybSBwb3J0IHN1cHBvcnRzIGFsbCBURi1NIHJlZ3Jlc3Npb24gdGVzdHMgKFNlY3VyZSBhbmQgTm9uLXNlY3VyZSkKK3dpdGggSXNvbGF0aW9uIExldmVsIDEgYW5kIDIsIGJ1dCBidWlsZGluZyB3aXRob3V0IEJMMiBpcyBub3Qgc3VwcG9ydGVkLgorCitCdWlsZGluZyBURi1NCistLS0tLS0tLS0tLS0tCisKK0ZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIDpkb2M6YEJ1aWxkaW5nIGluc3RydWN0aW9ucyA8L2RvY3MvdGVjaG5pY2FsX3JlZmVyZW5jZXMvaW5zdHJ1Y3Rpb25zL3RmbV9idWlsZF9pbnN0cnVjdGlvbj5gLgorQnVpbGQgaW5zdHJ1Y3Rpb25zIHdpdGggcGxhdGZvcm0gbmFtZTogYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcyAoLURURk1fUExBVEZPUk09YXJtL21wczMvY29yc3RvbmVfcG9sYXJpcykuCisKKypDb3B5cmlnaHQgKGMpIDIwMjEsIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLioKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9ib290X2hhbC5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Jvb3RfaGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5Mzk3MgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9ib290X2hhbC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMCwgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICoKKyAqLworCisjaW5jbHVkZSAiY21zaXMuaCIKKyNpbmNsdWRlICJyZWdpb24uaCIKKyNpbmNsdWRlICJ0YXJnZXRfY2ZnLmgiCisjaW5jbHVkZSAiYm9vdF9oYWwuaCIKKyNpbmNsdWRlICJEcml2ZXJfRmxhc2guaCIKKyNpbmNsdWRlICJmbGFzaF9sYXlvdXQuaCIKKworLyogRmxhc2ggZGV2aWNlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGFyZ2V0ICovCitleHRlcm4gQVJNX0RSSVZFUl9GTEFTSCBGTEFTSF9ERVZfTkFNRTsKKworUkVHSU9OX0RFQ0xBUkUoSW1hZ2UkJCwgRVJfREFUQSwgJCRCYXNlKVtdOworUkVHSU9OX0RFQ0xBUkUoSW1hZ2UkJCwgQVJNX0xJQl9IRUFQLCAkJFpJJCRMaW1pdClbXTsKK1JFR0lPTl9ERUNMQVJFKEltYWdlJCQsIEFSTV9MSUJfU1RBQ0ssICQkWkkkJEJhc2UpOworCitfX2F0dHJpYnV0ZV9fKChuYWtlZCkpIHZvaWQgYm9vdF9jbGVhcl9ibDJfcmFtX2FyZWEodm9pZCkKK3sKKyAgICBfX0FTTSB2b2xhdGlsZSgKKyAgICAgICAgIm1vdiAgICAgcjAsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJzdWJzICAgICUxLCAlMSwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAiTG9vcDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgInN1YnMgICAgJTEsICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJpdHQgICAgIGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICAic3RyZ2UgICByMCwgWyUwLCAlMV0gICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICAgImJnZSAgICAgTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJieCAgICAgIGxyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICAgICA6CisgICAgICAgIDogInIiIChSRUdJT05fTkFNRShJbWFnZSQkLCBFUl9EQVRBLCAkJEJhc2UpKSwKKyAgICAgICAgICAiciIgKFJFR0lPTl9OQU1FKEltYWdlJCQsIEFSTV9MSUJfSEVBUCwgJCRaSSQkTGltaXQpKQorICAgICAgICA6ICJyMCIsICJtZW1vcnkiCisgICAgKTsKK30KKworaW50MzJfdCBib290X3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKyAgICBpbnQzMl90IHJlc3VsdDsKKworICAgIC8qIEluaXRpYWxpemUgc3RhY2sgbGltaXQgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCBtc3Bfc3RhY2tfYm90dG9tID0KKyAgICAgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgQVJNX0xJQl9TVEFDSywgJCRaSSQkQmFzZSk7CisKKyAgICBfX3NldF9NU1BMSU0obXNwX3N0YWNrX2JvdHRvbSk7CisKKyAgICByZXN1bHQgPSBGTEFTSF9ERVZfTkFNRS5Jbml0aWFsaXplKE5VTEwpOworICAgIGlmIChyZXN1bHQgIT0gQVJNX0RSSVZFUl9PSykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBib290X3BsYXRmb3JtX3F1aXQoc3RydWN0IGJvb3RfYXJtX3ZlY3Rvcl90YWJsZSAqdnQpCit7CisgICAgLyogQ2xhbmcgYXQgTzAsIHN0b3JlcyB2YXJpYWJsZXMgb24gdGhlIHN0YWNrIHdpdGggU1AgcmVsYXRpdmUgYWRkcmVzc2luZy4KKyAgICAgKiBXaGVuIG1hbnVhbGx5IHNldCB0aGUgU1AgdGhlbiB0aGUgcGxhY2Ugb2YgcmVzZXQgdmVjdG9yIGlzIGxvc3QuCisgICAgICogU3RhdGljIHZhcmlhYmxlcyBhcmUgc3RvcmVkIGluICdkYXRhJyBvciAnYnNzJyBzZWN0aW9uLCBjaGFuZ2Ugb2YgU1AgaGFzCisgICAgICogbm8gZWZmZWN0IG9uIHRoZW0uCisgICAgICovCisgICAgc3RhdGljIHN0cnVjdCBib290X2FybV92ZWN0b3JfdGFibGUgKnZ0X2NweTsKKyAgICBpbnQzMl90IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IEZMQVNIX0RFVl9OQU1FLlVuaW5pdGlhbGl6ZSgpOworICAgIGlmIChyZXN1bHQgIT0gQVJNX0RSSVZFUl9PSykgeworICAgICAgICB3aGlsZSAoMSk7CisgICAgfQorCisgICAgdnRfY3B5ID0gdnQ7CisKKyAgICBfX3NldF9NU1BMSU0oMCk7CisgICAgX19zZXRfTVNQKHZ0LT5tc3ApOworICAgIF9fRFNCKCk7CisgICAgX19JU0IoKTsKKworICAgIGJvb3RfanVtcF90b19uZXh0X2ltYWdlKHZ0X2NweS0+cmVzZXQpOworfQorCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9Ecml2ZXJfRmxhc2guYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL0RyaXZlcl9GbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzg0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9Ecml2ZXJfRmxhc2guYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgIkRyaXZlcl9GbGFzaC5oIgorI2luY2x1ZGUgIlJURV9EZXZpY2UuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybV9iYXNlX2FkZHJlc3MuaCIKKworI2lmbmRlZiBBUkdfVU5VU0VECisjZGVmaW5lIEFSR19VTlVTRUQoYXJnKSAgKCh2b2lkKWFyZykKKyNlbmRpZgorCisjZGVmaW5lIEZMQVNIMF9CQVNFX1MgICAgICAgICBTUkFNX0JBU0VfUworI2RlZmluZSBGTEFTSDBfQkFTRV9OUyAgICAgICAgU1JBTV9CQVNFX05TCisjZGVmaW5lIEZMQVNIMF9TSVpFICAgICAgICAgICBTUkFNX1NJWkUKKyNkZWZpbmUgRkxBU0gwX1NFQ1RPUl9TSVpFICAgIDB4MDAwMDEwMDAgLyogNCBrQiAqLworI2RlZmluZSBGTEFTSDBfUEFHRV9TSVpFICAgICAgMHgwMDAwMTAwMCAvKiA0IGtCICovCisjZGVmaW5lIEZMQVNIMF9QUk9HUkFNX1VOSVQgICAweDEgICAgICAgIC8qIE1pbmltdW0gd3JpdGUgc2l6ZSAqLworCisvKiBEcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBBUk1fRkxBU0hfRFJWX1ZFUlNJT04gICAgICBBUk1fRFJJVkVSX1ZFUlNJT05fTUFKT1JfTUlOT1IoMSwgMSkKKyNkZWZpbmUgQVJNX0ZMQVNIX0RSVl9FUkFTRV9WQUxVRSAgMHhGRgorCisvKgorICogQVJNIEZMQVNIIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGRyaXZlciBqdXN0IGVtdWxhdGVzIGEgZmxhc2ggaW50ZXJmYWNlIGFuZCBiZWhhdmlvdXIgb24gdG9wIG9mIHRoZSBTUkFNCisgKiBtZW1vcnkuCisgKi8KK3N0cnVjdCBhcm1fZmxhc2hfZGV2X3QgeworICAgIGNvbnN0IHVpbnQzMl90IG1lbW9yeV9iYXNlOyAgIC8qITwgRkxBU0ggbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIEFSTV9GTEFTSF9JTkZPICpkYXRhOyAgICAgICAgIC8qITwgRkxBU0ggZGF0YSAqLworfTsKKworLyogRmxhc2ggU3RhdHVzICovCitzdGF0aWMgQVJNX0ZMQVNIX1NUQVRVUyBGbGFzaFN0YXR1cyA9IHswLCAwLCAwfTsKKworLyogRHJpdmVyIFZlcnNpb24gKi8KK3N0YXRpYyBjb25zdCBBUk1fRFJJVkVSX1ZFUlNJT04gRHJpdmVyVmVyc2lvbiA9IHsKKyAgICBBUk1fRkxBU0hfQVBJX1ZFUlNJT04sCisgICAgQVJNX0ZMQVNIX0RSVl9WRVJTSU9OCit9OworCisvKiBEcml2ZXIgQ2FwYWJpbGl0aWVzICovCitzdGF0aWMgY29uc3QgQVJNX0ZMQVNIX0NBUEFCSUxJVElFUyBEcml2ZXJDYXBhYmlsaXRpZXMgPSB7CisgICAgMCwgLyogZXZlbnRfcmVhZHkgKi8KKyAgICAwLCAvKiBkYXRhX3dpZHRoID0gMDo4LWJpdCwgMToxNi1iaXQsIDI6MzItYml0ICovCisgICAgMSAgLyogZXJhc2VfY2hpcCAqLworfTsKKworc3RhdGljIGludDMyX3QgaXNfcmFuZ2VfdmFsaWQoc3RydWN0IGFybV9mbGFzaF9kZXZfdCAqZmxhc2hfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIHVpbnQzMl90IGZsYXNoX2xpbWl0ID0gMDsKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIGZsYXNoX2xpbWl0ID0gKGZsYXNoX2Rldi0+ZGF0YS0+c2VjdG9yX2NvdW50ICogZmxhc2hfZGV2LT5kYXRhLT5zZWN0b3Jfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAtIDE7CisKKyAgICBpZiAob2Zmc2V0ID4gZmxhc2hfbGltaXQpIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50MzJfdCBpc193cml0ZV9hbGlnbmVkKHN0cnVjdCBhcm1fZmxhc2hfZGV2X3QgKmZsYXNoX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFyYW0pCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBpZiAoKHBhcmFtICUgZmxhc2hfZGV2LT5kYXRhLT5wcm9ncmFtX3VuaXQpICE9IDApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50MzJfdCBpc19zZWN0b3JfYWxpZ25lZChzdHJ1Y3QgYXJtX2ZsYXNoX2Rldl90ICpmbGFzaF9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBpZiAoKG9mZnNldCAlIGZsYXNoX2Rldi0+ZGF0YS0+c2VjdG9yX3NpemUpICE9IDApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50MzJfdCBpc19mbGFzaF9yZWFkeV90b193cml0ZShjb25zdCB1aW50OF90ICpzdGFydF9hZGRyLCB1aW50MzJfdCBjbnQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDMyX3QgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBpZihzdGFydF9hZGRyW2ldICE9IEFSTV9GTEFTSF9EUlZfRVJBU0VfVkFMVUUpIHsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworI2lmIChSVEVfRkxBU0gwKQorc3RhdGljIEFSTV9GTEFTSF9JTkZPIEFSTV9GTEFTSDBfREVWX0RBVEEgPSB7CisgICAgLnNlY3Rvcl9pbmZvICA9IE5VTEwsICAgICAgICAgICAgICAgICAgLyogVW5pZm9ybSBzZWN0b3IgbGF5b3V0ICovCisgICAgLnNlY3Rvcl9jb3VudCA9IEZMQVNIMF9TSVpFIC8gRkxBU0gwX1NFQ1RPUl9TSVpFLAorICAgIC5zZWN0b3Jfc2l6ZSAgPSBGTEFTSDBfU0VDVE9SX1NJWkUsCisgICAgLnBhZ2Vfc2l6ZSAgICA9IEZMQVNIMF9QQUdFX1NJWkUsCisgICAgLnByb2dyYW1fdW5pdCA9IEZMQVNIMF9QUk9HUkFNX1VOSVQsCisgICAgLmVyYXNlZF92YWx1ZSA9IEFSTV9GTEFTSF9EUlZfRVJBU0VfVkFMVUV9OworCitzdGF0aWMgc3RydWN0IGFybV9mbGFzaF9kZXZfdCBBUk1fRkxBU0gwX0RFViA9IHsKKyNpZiAoX19ET01BSU5fTlMgPT0gMSkKKyAgICAubWVtb3J5X2Jhc2UgPSBGTEFTSDBfQkFTRV9OUywKKyNlbHNlCisgICAgLm1lbW9yeV9iYXNlID0gRkxBU0gwX0JBU0VfUywKKyNlbmRpZiAvKiBfX0RPTUFJTl9OUyA9PSAxICovCisgICAgLmRhdGEgICAgICAgID0gJihBUk1fRkxBU0gwX0RFVl9EQVRBKX07CisKK3N0cnVjdCBhcm1fZmxhc2hfZGV2X3QgKkZMQVNIMF9ERVYgPSAmQVJNX0ZMQVNIMF9ERVY7CisKKy8qCisgKiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgQVJNX0RSSVZFUl9WRVJTSU9OIEFSTV9GbGFzaF9HZXRWZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIERyaXZlclZlcnNpb247Cit9CisKK3N0YXRpYyBBUk1fRkxBU0hfQ0FQQUJJTElUSUVTIEFSTV9GbGFzaF9HZXRDYXBhYmlsaXRpZXModm9pZCkKK3sKKyAgICByZXR1cm4gRHJpdmVyQ2FwYWJpbGl0aWVzOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fRmxhc2hfSW5pdGlhbGl6ZShBUk1fRmxhc2hfU2lnbmFsRXZlbnRfdCBjYl9ldmVudCkKK3sKKyAgICBBUkdfVU5VU0VEKGNiX2V2ZW50KTsKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgQVJNX0ZsYXNoX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fRmxhc2hfUG93ZXJDb250cm9sKEFSTV9QT1dFUl9TVEFURSBzdGF0ZSkKK3sKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBBUk1fUE9XRVJfRlVMTDoKKyAgICAgICAgLyogTm90aGluZyB0byBiZSBkb25lICovCisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVJNX1BPV0VSX09GRjoKKyAgICBjYXNlIEFSTV9QT1dFUl9MT1c6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorfQorCitzdGF0aWMgaW50MzJfdCBBUk1fRmxhc2hfUmVhZERhdGEodWludDMyX3QgYWRkciwgdm9pZCAqZGF0YSwgdWludDMyX3QgY250KQoreworICAgIHVpbnQzMl90IHN0YXJ0X2FkZHIgPSBGTEFTSDBfREVWLT5tZW1vcnlfYmFzZSArIGFkZHI7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICAvKiBDaGVjayBmbGFzaCBtZW1vcnkgYm91bmRhcmllcyAqLworICAgIHJjID0gaXNfcmFuZ2VfdmFsaWQoRkxBU0gwX0RFViwgYWRkciArIGNudCk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1JfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8qIEZsYXNoIGludGVyZmFjZSBqdXN0IGVtdWxhdGVkIG92ZXIgU1JBTSwgdXNlIG1lbWNweSAqLworICAgIG1lbWNweShkYXRhLCAodm9pZCAqKXN0YXJ0X2FkZHIsIGNudCk7CisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9GbGFzaF9Qcm9ncmFtRGF0YSh1aW50MzJfdCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNudCkKK3sKKyAgICB1aW50MzJfdCBzdGFydF9hZGRyID0gRkxBU0gwX0RFVi0+bWVtb3J5X2Jhc2UgKyBhZGRyOworICAgIGludDMyX3QgcmMgPSAwOworCisgICAgLyogQ2hlY2sgZmxhc2ggbWVtb3J5IGJvdW5kYXJpZXMgYW5kIGFsaWdubWVudCB3aXRoIG1pbmltYWwgd3JpdGUgc2l6ZSAqLworICAgIHJjICA9IGlzX3JhbmdlX3ZhbGlkKEZMQVNIMF9ERVYsIGFkZHIgKyBjbnQpOworICAgIHJjIHw9IGlzX3dyaXRlX2FsaWduZWQoRkxBU0gwX0RFViwgYWRkcik7CisgICAgcmMgfD0gaXNfd3JpdGVfYWxpZ25lZChGTEFTSDBfREVWLCBjbnQpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgZmxhc2ggYXJlYSB0byB3cml0ZSB0aGUgZGF0YSB3YXMgZXJhc2VkIHByZXZpb3VzbHkgKi8KKyAgICByYyA9IGlzX2ZsYXNoX3JlYWR5X3RvX3dyaXRlKChjb25zdCB1aW50OF90KilzdGFydF9hZGRyLCBjbnQpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIC8qIEZsYXNoIGludGVyZmFjZSBqdXN0IGVtdWxhdGVkIG92ZXIgU1JBTSwgdXNlIG1lbWNweSAqLworICAgIG1lbWNweSgodm9pZCAqKXN0YXJ0X2FkZHIsIGRhdGEsIGNudCk7CisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9GbGFzaF9FcmFzZVNlY3Rvcih1aW50MzJfdCBhZGRyKQoreworICAgIHVpbnQzMl90IHN0YXJ0X2FkZHIgPSBGTEFTSDBfREVWLT5tZW1vcnlfYmFzZSArIGFkZHI7CisgICAgdWludDMyX3QgcmMgPSAwOworCisgICAgcmMgID0gaXNfcmFuZ2VfdmFsaWQoRkxBU0gwX0RFViwgYWRkcik7CisgICAgcmMgfD0gaXNfc2VjdG9yX2FsaWduZWQoRkxBU0gwX0RFViwgYWRkcik7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1JfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8qIEZsYXNoIGludGVyZmFjZSBqdXN0IGVtdWxhdGVkIG92ZXIgU1JBTSwgdXNlIG1lbXNldCAqLworICAgIG1lbXNldCgodm9pZCAqKXN0YXJ0X2FkZHIsCisgICAgICAgICAgIEZMQVNIMF9ERVYtPmRhdGEtPmVyYXNlZF92YWx1ZSwKKyAgICAgICAgICAgRkxBU0gwX0RFVi0+ZGF0YS0+c2VjdG9yX3NpemUpOworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fRmxhc2hfRXJhc2VDaGlwKHZvaWQpCit7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBhZGRyID0gRkxBU0gwX0RFVi0+bWVtb3J5X2Jhc2U7CisgICAgaW50MzJfdCByYyA9IEFSTV9EUklWRVJfRVJST1JfVU5TVVBQT1JURUQ7CisKKyAgICAvKiBDaGVjayBkcml2ZXIgY2FwYWJpbGl0eSBlcmFzZV9jaGlwIGJpdCAqLworICAgIGlmIChEcml2ZXJDYXBhYmlsaXRpZXMuZXJhc2VfY2hpcCA9PSAxKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGTEFTSDBfREVWLT5kYXRhLT5zZWN0b3JfY291bnQ7IGkrKykgeworICAgICAgICAgICAgLyogRmxhc2ggaW50ZXJmYWNlIGp1c3QgZW11bGF0ZWQgb3ZlciBTUkFNLCB1c2UgbWVtc2V0ICovCisgICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilhZGRyLAorICAgICAgICAgICAgICAgICAgIEZMQVNIMF9ERVYtPmRhdGEtPmVyYXNlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBGTEFTSDBfREVWLT5kYXRhLT5zZWN0b3Jfc2l6ZSk7CisKKyAgICAgICAgICAgIGFkZHIgKz0gRkxBU0gwX0RFVi0+ZGF0YS0+c2VjdG9yX3NpemU7CisgICAgICAgICAgICByYyA9IEFSTV9EUklWRVJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgQVJNX0ZMQVNIX1NUQVRVUyBBUk1fRmxhc2hfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgcmV0dXJuIEZsYXNoU3RhdHVzOworfQorCitzdGF0aWMgQVJNX0ZMQVNIX0lORk8gKiBBUk1fRmxhc2hfR2V0SW5mbyh2b2lkKQoreworICAgIHJldHVybiBGTEFTSDBfREVWLT5kYXRhOworfQorCitBUk1fRFJJVkVSX0ZMQVNIIERyaXZlcl9GTEFTSDAgPSB7CisgICAgQVJNX0ZsYXNoX0dldFZlcnNpb24sCisgICAgQVJNX0ZsYXNoX0dldENhcGFiaWxpdGllcywKKyAgICBBUk1fRmxhc2hfSW5pdGlhbGl6ZSwKKyAgICBBUk1fRmxhc2hfVW5pbml0aWFsaXplLAorICAgIEFSTV9GbGFzaF9Qb3dlckNvbnRyb2wsCisgICAgQVJNX0ZsYXNoX1JlYWREYXRhLAorICAgIEFSTV9GbGFzaF9Qcm9ncmFtRGF0YSwKKyAgICBBUk1fRmxhc2hfRXJhc2VTZWN0b3IsCisgICAgQVJNX0ZsYXNoX0VyYXNlQ2hpcCwKKyAgICBBUk1fRmxhc2hfR2V0U3RhdHVzLAorICAgIEFSTV9GbGFzaF9HZXRJbmZvCit9OworI2VuZGlmIC8qIFJURV9GTEFTSDAgKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL0RyaXZlcl9NUEMuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL0RyaXZlcl9NUEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0NjMxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX01QQy5jCkBAIC0wLDAgKzEsNzY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMjAgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkRyaXZlcl9NUEMuaCIKKworI2luY2x1ZGUgIm1wY19zaWVfZHJ2LmgiCisjaW5jbHVkZSAiY21zaXNfZHJpdmVyX2NvbmZpZy5oIgorI2luY2x1ZGUgIlJURV9EZXZpY2UuaCIKKworLyogRHJpdmVyIHZlcnNpb24gKi8KKyNkZWZpbmUgQVJNX01QQ19EUlZfVkVSU0lPTiBBUk1fRFJJVkVSX1ZFUlNJT05fTUFKT1JfTUlOT1IoMiwgMCkKKworLyogRHJpdmVyIFZlcnNpb24gKi8KK3N0YXRpYyBjb25zdCBBUk1fRFJJVkVSX1ZFUlNJT04gRHJpdmVyVmVyc2lvbiA9IHsKKyAgICBBUk1fTVBDX0FQSV9WRVJTSU9OLAorICAgIEFSTV9NUENfRFJWX1ZFUlNJT04KK307CisKK3N0YXRpYyBBUk1fRFJJVkVSX1ZFUlNJT04gQVJNX01QQ19HZXRWZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIERyaXZlclZlcnNpb247Cit9CisKKy8qCisgKiBcYnJpZWYgVHJhbnNsYXRlcyBlcnJvciBjb2RlcyBmcm9tIG5hdGl2ZSBBUEkgdG8gQ01TSVMgQVBJLgorICoKKyAqIFxwYXJhbVtpbl0gZXJyICBFcnJvciBjb2RlIHRvIHRyYW5zbGF0ZSAoXHJlZiBtcGNfc2llX2Vycm9yX3QpLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBDTVNJUyBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50MzJfdCBlcnJvcl90cmFucyhlbnVtIG1wY19zaWVfZXJyb3JfdCBlcnIpCit7CisgICAgc3dpdGNoKGVycikgeworICAgIGNhc2UgTVBDX1NJRV9FUlJfTk9ORToKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7CisgICAgY2FzZSBNUENfU0lFX0lOVkFMSURfQVJHOgorICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9QQVJBTUVURVI7CisgICAgY2FzZSBNUENfU0lFX05PVF9JTklUOgorICAgICAgICByZXR1cm4gQVJNX01QQ19FUlJfTk9UX0lOSVQ7CisgICAgY2FzZSBNUENfU0lFX0VSUl9OT1RfSU5fUkFOR0U6CisgICAgICAgIHJldHVybiBBUk1fTVBDX0VSUl9OT1RfSU5fUkFOR0U7CisgICAgY2FzZSBNUENfU0lFX0VSUl9OT1RfQUxJR05FRDoKKyAgICAgICAgcmV0dXJuIEFSTV9NUENfRVJSX05PVF9BTElHTkVEOworICAgIGNhc2UgTVBDX1NJRV9FUlJfSU5WQUxJRF9SQU5HRToKKyAgICAgICAgcmV0dXJuIEFSTV9NUENfRVJSX0lOVkFMSURfUkFOR0U7CisgICAgY2FzZSBNUENfU0lFX0VSUl9SQU5HRV9TRUNfQVRUUl9OT05fQ09NUEFUSUJMRToKKyAgICAgICAgcmV0dXJuIEFSTV9NUENfRVJSX1JBTkdFX1NFQ19BVFRSX05PTl9DT01QQVRJQkxFOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBUk1fTVBDX0VSUl9VTlNQRUNJRklFRDsKKyAgICB9Cit9CisKKyNpZiAoUlRFX1NSQU1fTVBDKQorLyogUmFuZ2VzIGNvbnRyb2xsZWQgYnkgdGhpcyBTUkFNX01QQyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90IE1QQ19TUkFNX1JBTkdFX1MgPSB7CisgICAgLmJhc2UgICAgICAgICA9IE1QQ19TUkFNX1JBTkdFX0JBU0VfUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX1NSQU1fUkFOR0VfTElNSVRfUywKKyAgICAucmFuZ2Vfb2Zmc2V0ID0gMCwKKyAgICAuYXR0ciAgICAgICAgID0gTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCBNUENfU1JBTV9SQU5HRV9OUyA9IHsKKyAgICAuYmFzZSAgICAgICAgID0gTVBDX1NSQU1fUkFOR0VfQkFTRV9OUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX1NSQU1fUkFOR0VfTElNSVRfTlMsCisgICAgLnJhbmdlX29mZnNldCA9IDAsCisgICAgLmF0dHIgICAgICAgICA9IE1QQ19TSUVfU0VDX0FUVFJfTk9OU0VDVVJFCit9OworCisjZGVmaW5lIE1QQ19TUkFNX1JBTkdFX0xJU1RfTEVOICAydQorc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KgorICAgIE1QQ19TUkFNX1JBTkdFX0xJU1RbTVBDX1NSQU1fUkFOR0VfTElTVF9MRU5dID0geworICAgICAgICAmTVBDX1NSQU1fUkFOR0VfUywKKyAgICAgICAgJk1QQ19TUkFNX1JBTkdFX05TCisgICAgfTsKKworLyogU1JBTV9NUEMgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19Jbml0aWFsaXplKHZvaWQpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9pbml0KCZNUENfU1JBTV9ERVYsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19TUkFNX1JBTkdFX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19TUkFNX1JBTkdFX0xJU1RfTEVOKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19VbmluaXRpYWxpemUodm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgU1JBTV9NUENfR2V0QmxvY2tTaXplKHVpbnQzMl90ICpibGtfc2l6ZSkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9ibG9ja19zaXplKCZNUENfU1JBTV9ERVYsIGJsa19zaXplKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19HZXRDdHJsQ29uZmlnKHVpbnQzMl90ICpjdHJsX3ZhbCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9jdHJsKCZNUENfU1JBTV9ERVYsIGN0cmxfdmFsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19TZXRDdHJsQ29uZmlnKHVpbnQzMl90IGN0cmwpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9zZXRfY3RybCgmTVBDX1NSQU1fREVWLCBjdHJsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19HZXRSZWdpb25Db25maWcodWludHB0cl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX1NFQ19BVFRSICphdHRyKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfZ2V0X3JlZ2lvbl9jb25maWcoJk1QQ19TUkFNX0RFViwgYmFzZSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBtcGNfc2llX3NlY19hdHRyX3QqKWF0dHIpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFNSQU1fTVBDX0NvbmZpZ1JlZ2lvbih1aW50cHRyX3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9NUENfU0VDX0FUVFIgYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2NvbmZpZ19yZWdpb24oJk1QQ19TUkFNX0RFViwgYmFzZSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIG1wY19zaWVfc2VjX2F0dHJfdClhdHRyKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2lycV9lbmFibGUoJk1QQ19TUkFNX0RFVik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIHZvaWQgU1JBTV9NUENfRGlzYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIG1wY19zaWVfaXJxX2Rpc2FibGUoJk1QQ19TUkFNX0RFVik7Cit9CisKKworc3RhdGljIHZvaWQgU1JBTV9NUENfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBtcGNfc2llX2NsZWFyX2lycSgmTVBDX1NSQU1fREVWKTsKK30KKworc3RhdGljIHVpbnQzMl90IFNSQU1fTVBDX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIG1wY19zaWVfaXJxX3N0YXRlKCZNUENfU1JBTV9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBTUkFNX01QQ19Mb2NrRG93bih2b2lkKQoreworICAgIHJldHVybiBtcGNfc2llX2xvY2tfZG93bigmTVBDX1NSQU1fREVWKTsKK30KKworLyogU1JBTV9NUEMgRHJpdmVyIENNU0lTIGFjY2VzcyBzdHJ1Y3R1cmUgKi8KK0FSTV9EUklWRVJfTVBDIERyaXZlcl9TUkFNX01QQyA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICA9IEFSTV9NUENfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICA9IFNSQU1fTVBDX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgPSBTUkFNX01QQ19VbmluaXRpYWxpemUsCisgICAgLkdldEJsb2NrU2l6ZSAgICAgPSBTUkFNX01QQ19HZXRCbG9ja1NpemUsCisgICAgLkdldEN0cmxDb25maWcgICAgPSBTUkFNX01QQ19HZXRDdHJsQ29uZmlnLAorICAgIC5TZXRDdHJsQ29uZmlnICAgID0gU1JBTV9NUENfU2V0Q3RybENvbmZpZywKKyAgICAuQ29uZmlnUmVnaW9uICAgICA9IFNSQU1fTVBDX0NvbmZpZ1JlZ2lvbiwKKyAgICAuR2V0UmVnaW9uQ29uZmlnICA9IFNSQU1fTVBDX0dldFJlZ2lvbkNvbmZpZywKKyAgICAuRW5hYmxlSW50ZXJydXB0ICA9IFNSQU1fTVBDX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCA9IFNSQU1fTVBDX0Rpc2FibGVJbnRlcnJ1cHQsCisgICAgLkNsZWFySW50ZXJydXB0ICAgPSBTUkFNX01QQ19DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICA9IFNSQU1fTVBDX0ludGVycnVwdFN0YXRlLAorICAgIC5Mb2NrRG93biAgICAgICAgID0gU1JBTV9NUENfTG9ja0Rvd24sCit9OworI2VuZGlmIC8qIFJURV9TUkFNX01QQyAqLworCisjaWYgKFJURV9JU1JBTTBfTVBDKQorLyogUmFuZ2VzIGNvbnRyb2xsZWQgYnkgdGhpcyBJU1JBTTBfTVBDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QgTVBDX0lTUkFNMF9SQU5HRV9TID0geworICAgIC5iYXNlICAgICAgICAgPSBNUENfSVNSQU0wX1JBTkdFX0JBU0VfUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX0lTUkFNMF9SQU5HRV9MSU1JVF9TLAorICAgIC5yYW5nZV9vZmZzZXQgPSAwLAorICAgIC5hdHRyICAgICAgICAgPSBNUENfU0lFX1NFQ19BVFRSX1NFQ1VSRQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90IE1QQ19JU1JBTTBfUkFOR0VfTlMgPSB7CisgICAgLmJhc2UgICAgICAgICA9IE1QQ19JU1JBTTBfUkFOR0VfQkFTRV9OUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX0lTUkFNMF9SQU5HRV9MSU1JVF9OUywKKyAgICAucmFuZ2Vfb2Zmc2V0ID0gMCwKKyAgICAuYXR0ciAgICAgICAgID0gTVBDX1NJRV9TRUNfQVRUUl9OT05TRUNVUkUKK307CisKKyNkZWZpbmUgTVBDX0lTUkFNMF9SQU5HRV9MSVNUX0xFTiAgMnUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCoKKyAgICBNUENfSVNSQU0wX1JBTkdFX0xJU1RbTVBDX0lTUkFNMF9SQU5HRV9MSVNUX0xFTl0gPSB7CisgICAgICAgICZNUENfSVNSQU0wX1JBTkdFX1MsCisgICAgICAgICZNUENfSVNSQU0wX1JBTkdFX05TCisgICAgfTsKKworLyogSVNSQU0wX01QQyBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQzMl90IElTUkFNMF9NUENfSW5pdGlhbGl6ZSh2b2lkKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfaW5pdCgmTVBDX0lTUkFNMF9ERVYsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19JU1JBTTBfUkFOR0VfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgTVBDX0lTUkFNMF9SQU5HRV9MSVNUX0xFTik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0wX01QQ19VbmluaXRpYWxpemUodm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0wX01QQ19HZXRCbG9ja1NpemUodWludDMyX3QgKmJsa19zaXplKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfZ2V0X2Jsb2NrX3NpemUoJk1QQ19JU1JBTTBfREVWLCBibGtfc2l6ZSk7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0wX01QQ19HZXRDdHJsQ29uZmlnKHVpbnQzMl90ICpjdHJsX3ZhbCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9jdHJsKCZNUENfSVNSQU0wX0RFViwgY3RybF92YWwpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IElTUkFNMF9NUENfU2V0Q3RybENvbmZpZyh1aW50MzJfdCBjdHJsKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfc2V0X2N0cmwoJk1QQ19JU1JBTTBfREVWLCBjdHJsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBJU1JBTTBfTVBDX0dldFJlZ2lvbkNvbmZpZyh1aW50cHRyX3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9NUENfU0VDX0FUVFIgKmF0dHIpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9nZXRfcmVnaW9uX2NvbmZpZygmTVBDX0lTUkFNMF9ERVYsIGJhc2UsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gbXBjX3NpZV9zZWNfYXR0cl90KilhdHRyKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBJU1JBTTBfTVBDX0NvbmZpZ1JlZ2lvbih1aW50cHRyX3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9NUENfU0VDX0FUVFIgYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2NvbmZpZ19yZWdpb24oJk1QQ19JU1JBTTBfREVWLCBiYXNlLCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gbXBjX3NpZV9zZWNfYXR0cl90KWF0dHIpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IElTUkFNMF9NUENfRW5hYmxlSW50ZXJydXB0KHZvaWQpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9pcnFfZW5hYmxlKCZNUENfSVNSQU0wX0RFVik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIHZvaWQgSVNSQU0wX01QQ19EaXNhYmxlSW50ZXJydXB0KHZvaWQpCit7CisgICAgbXBjX3NpZV9pcnFfZGlzYWJsZSgmTVBDX0lTUkFNMF9ERVYpOworfQorCisKK3N0YXRpYyB2b2lkIElTUkFNMF9NUENfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBtcGNfc2llX2NsZWFyX2lycSgmTVBDX0lTUkFNMF9ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgSVNSQU0wX01QQ19JbnRlcnJ1cHRTdGF0ZSh2b2lkKQoreworICAgIHJldHVybiBtcGNfc2llX2lycV9zdGF0ZSgmTVBDX0lTUkFNMF9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBJU1JBTTBfTVBDX0xvY2tEb3duKHZvaWQpCit7CisgICAgcmV0dXJuIG1wY19zaWVfbG9ja19kb3duKCZNUENfSVNSQU0wX0RFVik7Cit9CisKKy8qIElTUkFNMF9NUEMgRHJpdmVyIENNU0lTIGFjY2VzcyBzdHJ1Y3R1cmUgKi8KK0FSTV9EUklWRVJfTVBDIERyaXZlcl9JU1JBTTBfTVBDID0geworICAgIC5HZXRWZXJzaW9uICAgICAgID0gQVJNX01QQ19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgID0gSVNSQU0wX01QQ19Jbml0aWFsaXplLAorICAgIC5VbmluaXRpYWxpemUgICAgID0gSVNSQU0wX01QQ19VbmluaXRpYWxpemUsCisgICAgLkdldEJsb2NrU2l6ZSAgICAgPSBJU1JBTTBfTVBDX0dldEJsb2NrU2l6ZSwKKyAgICAuR2V0Q3RybENvbmZpZyAgICA9IElTUkFNMF9NUENfR2V0Q3RybENvbmZpZywKKyAgICAuU2V0Q3RybENvbmZpZyAgICA9IElTUkFNMF9NUENfU2V0Q3RybENvbmZpZywKKyAgICAuQ29uZmlnUmVnaW9uICAgICA9IElTUkFNMF9NUENfQ29uZmlnUmVnaW9uLAorICAgIC5HZXRSZWdpb25Db25maWcgID0gSVNSQU0wX01QQ19HZXRSZWdpb25Db25maWcsCisgICAgLkVuYWJsZUludGVycnVwdCAgPSBJU1JBTTBfTVBDX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCA9IElTUkFNMF9NUENfRGlzYWJsZUludGVycnVwdCwKKyAgICAuQ2xlYXJJbnRlcnJ1cHQgICA9IElTUkFNMF9NUENfQ2xlYXJJbnRlcnJ1cHQsCisgICAgLkludGVycnVwdFN0YXRlICAgPSBJU1JBTTBfTVBDX0ludGVycnVwdFN0YXRlLAorICAgIC5Mb2NrRG93biAgICAgICAgID0gSVNSQU0wX01QQ19Mb2NrRG93biwKK307CisjZW5kaWYgLyogUlRFX0lTUkFNMF9NUEMgKi8KKworI2lmIChSVEVfSVNSQU0xX01QQykKKy8qIFJhbmdlcyBjb250cm9sbGVkIGJ5IHRoaXMgSVNSQU0xX01QQyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90IE1QQ19JU1JBTTFfUkFOR0VfUyA9IHsKKyAgICAuYmFzZSAgICAgICAgID0gTVBDX0lTUkFNMV9SQU5HRV9CQVNFX1MsCisgICAgLmxpbWl0ICAgICAgICA9IE1QQ19JU1JBTTFfUkFOR0VfTElNSVRfUywKKyAgICAucmFuZ2Vfb2Zmc2V0ID0gMCwKKyAgICAuYXR0ciAgICAgICAgID0gTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCBNUENfSVNSQU0xX1JBTkdFX05TID0geworICAgIC5iYXNlICAgICAgICAgPSBNUENfSVNSQU0xX1JBTkdFX0JBU0VfTlMsCisgICAgLmxpbWl0ICAgICAgICA9IE1QQ19JU1JBTTFfUkFOR0VfTElNSVRfTlMsCisgICAgLnJhbmdlX29mZnNldCA9IDAsCisgICAgLmF0dHIgICAgICAgICA9IE1QQ19TSUVfU0VDX0FUVFJfTk9OU0VDVVJFCit9OworCisjZGVmaW5lIE1QQ19JU1JBTTFfUkFOR0VfTElTVF9MRU4gIDJ1CitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QqCisgICAgTVBDX0lTUkFNMV9SQU5HRV9MSVNUW01QQ19JU1JBTTFfUkFOR0VfTElTVF9MRU5dID0geworICAgICAgICAmTVBDX0lTUkFNMV9SQU5HRV9TLAorICAgICAgICAmTVBDX0lTUkFNMV9SQU5HRV9OUworICAgIH07CisKKy8qIElTUkFNMV9NUEMgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBJU1JBTTFfTVBDX0luaXRpYWxpemUodm9pZCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2luaXQoJk1QQ19JU1JBTTFfREVWLAorICAgICAgICAgICAgICAgICAgICAgICBNUENfSVNSQU0xX1JBTkdFX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19JU1JBTTFfUkFOR0VfTElTVF9MRU4pOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IElTUkFNMV9NUENfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBiZSBkb25lICovCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90IElTUkFNMV9NUENfR2V0QmxvY2tTaXplKHVpbnQzMl90ICpibGtfc2l6ZSkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9ibG9ja19zaXplKCZNUENfSVNSQU0xX0RFViwgYmxrX3NpemUpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IElTUkFNMV9NUENfR2V0Q3RybENvbmZpZyh1aW50MzJfdCAqY3RybF92YWwpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9nZXRfY3RybCgmTVBDX0lTUkFNMV9ERVYsIGN0cmxfdmFsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBJU1JBTTFfTVBDX1NldEN0cmxDb25maWcodWludDMyX3QgY3RybCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX3NldF9jdHJsKCZNUENfSVNSQU0xX0RFViwgY3RybCk7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0xX01QQ19HZXRSZWdpb25Db25maWcodWludHB0cl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX1NFQ19BVFRSICphdHRyKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfZ2V0X3JlZ2lvbl9jb25maWcoJk1QQ19JU1JBTTFfREVWLCBiYXNlLCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIG1wY19zaWVfc2VjX2F0dHJfdCopYXR0cik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0xX01QQ19Db25maWdSZWdpb24odWludHB0cl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX1NFQ19BVFRSIGF0dHIpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9jb25maWdfcmVnaW9uKCZNUENfSVNSQU0xX0RFViwgYmFzZSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIG1wY19zaWVfc2VjX2F0dHJfdClhdHRyKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBJU1JBTTFfTVBDX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfaXJxX2VuYWJsZSgmTVBDX0lTUkFNMV9ERVYpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIElTUkFNMV9NUENfRGlzYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIG1wY19zaWVfaXJxX2Rpc2FibGUoJk1QQ19JU1JBTTFfREVWKTsKK30KKworCitzdGF0aWMgdm9pZCBJU1JBTTFfTVBDX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgbXBjX3NpZV9jbGVhcl9pcnEoJk1QQ19JU1JBTTFfREVWKTsKK30KKworc3RhdGljIHVpbnQzMl90IElTUkFNMV9NUENfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gbXBjX3NpZV9pcnFfc3RhdGUoJk1QQ19JU1JBTTFfREVWKTsKK30KKworc3RhdGljIGludDMyX3QgSVNSQU0xX01QQ19Mb2NrRG93bih2b2lkKQoreworICAgIHJldHVybiBtcGNfc2llX2xvY2tfZG93bigmTVBDX0lTUkFNMV9ERVYpOworfQorCisvKiBJU1JBTTFfTVBDIERyaXZlciBDTVNJUyBhY2Nlc3Mgc3RydWN0dXJlICovCitBUk1fRFJJVkVSX01QQyBEcml2ZXJfSVNSQU0xX01QQyA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICA9IEFSTV9NUENfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICA9IElTUkFNMV9NUENfSW5pdGlhbGl6ZSwKKyAgICAuVW5pbml0aWFsaXplICAgICA9IElTUkFNMV9NUENfVW5pbml0aWFsaXplLAorICAgIC5HZXRCbG9ja1NpemUgICAgID0gSVNSQU0xX01QQ19HZXRCbG9ja1NpemUsCisgICAgLkdldEN0cmxDb25maWcgICAgPSBJU1JBTTFfTVBDX0dldEN0cmxDb25maWcsCisgICAgLlNldEN0cmxDb25maWcgICAgPSBJU1JBTTFfTVBDX1NldEN0cmxDb25maWcsCisgICAgLkNvbmZpZ1JlZ2lvbiAgICAgPSBJU1JBTTFfTVBDX0NvbmZpZ1JlZ2lvbiwKKyAgICAuR2V0UmVnaW9uQ29uZmlnICA9IElTUkFNMV9NUENfR2V0UmVnaW9uQ29uZmlnLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgID0gSVNSQU0xX01QQ19FbmFibGVJbnRlcnJ1cHQsCisgICAgLkRpc2FibGVJbnRlcnJ1cHQgPSBJU1JBTTFfTVBDX0Rpc2FibGVJbnRlcnJ1cHQsCisgICAgLkNsZWFySW50ZXJydXB0ICAgPSBJU1JBTTFfTVBDX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgID0gSVNSQU0xX01QQ19JbnRlcnJ1cHRTdGF0ZSwKKyAgICAuTG9ja0Rvd24gICAgICAgICA9IElTUkFNMV9NUENfTG9ja0Rvd24sCit9OworI2VuZGlmIC8qIFJURV9JU1JBTTFfTVBDICovCisKKyNpZiAoUlRFX1FTUElfTVBDKQorLyogUmFuZ2VzIGNvbnRyb2xsZWQgYnkgdGhpcyBRU1BJX01QQyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90IE1QQ19RU1BJX1JBTkdFX1MgPSB7CisgICAgLmJhc2UgICAgICAgICA9IE1QQ19RU1BJX1JBTkdFX0JBU0VfUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX1FTUElfUkFOR0VfTElNSVRfUywKKyAgICAucmFuZ2Vfb2Zmc2V0ID0gMCwKKyAgICAuYXR0ciAgICAgICAgID0gTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkUKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCBNUENfUVNQSV9SQU5HRV9OUyA9IHsKKyAgICAuYmFzZSAgICAgICAgID0gTVBDX1FTUElfUkFOR0VfQkFTRV9OUywKKyAgICAubGltaXQgICAgICAgID0gTVBDX1FTUElfUkFOR0VfTElNSVRfTlMsCisgICAgLnJhbmdlX29mZnNldCA9IDAsCisgICAgLmF0dHIgICAgICAgICA9IE1QQ19TSUVfU0VDX0FUVFJfTk9OU0VDVVJFCit9OworCisjZGVmaW5lIE1QQ19RU1BJX1JBTkdFX0xJU1RfTEVOICAydQorc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KgorICAgIE1QQ19RU1BJX1JBTkdFX0xJU1RbTVBDX1FTUElfUkFOR0VfTElTVF9MRU5dID0geworICAgICAgICAmTVBDX1FTUElfUkFOR0VfUywKKyAgICAgICAgJk1QQ19RU1BJX1JBTkdFX05TCisgICAgfTsKKworLyogUVNQSV9NUEMgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19Jbml0aWFsaXplKHZvaWQpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9pbml0KCZNUENfUVNQSV9ERVYsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19RU1BJX1JBTkdFX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgIE1QQ19RU1BJX1JBTkdFX0xJU1RfTEVOKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19VbmluaXRpYWxpemUodm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUVNQSV9NUENfR2V0QmxvY2tTaXplKHVpbnQzMl90ICpibGtfc2l6ZSkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9ibG9ja19zaXplKCZNUENfUVNQSV9ERVYsIGJsa19zaXplKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19HZXRDdHJsQ29uZmlnKHVpbnQzMl90ICpjdHJsX3ZhbCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9jdHJsKCZNUENfUVNQSV9ERVYsIGN0cmxfdmFsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19TZXRDdHJsQ29uZmlnKHVpbnQzMl90IGN0cmwpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9zZXRfY3RybCgmTVBDX1FTUElfREVWLCBjdHJsKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19HZXRSZWdpb25Db25maWcodWludHB0cl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX1NFQ19BVFRSICphdHRyKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfZ2V0X3JlZ2lvbl9jb25maWcoJk1QQ19RU1BJX0RFViwgYmFzZSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBtcGNfc2llX3NlY19hdHRyX3QqKWF0dHIpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFFTUElfTVBDX0NvbmZpZ1JlZ2lvbih1aW50cHRyX3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9NUENfU0VDX0FUVFIgYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2NvbmZpZ19yZWdpb24oJk1QQ19RU1BJX0RFViwgYmFzZSwgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIG1wY19zaWVfc2VjX2F0dHJfdClhdHRyKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2lycV9lbmFibGUoJk1QQ19RU1BJX0RFVik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIHZvaWQgUVNQSV9NUENfRGlzYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIG1wY19zaWVfaXJxX2Rpc2FibGUoJk1QQ19RU1BJX0RFVik7Cit9CisKKworc3RhdGljIHZvaWQgUVNQSV9NUENfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBtcGNfc2llX2NsZWFyX2lycSgmTVBDX1FTUElfREVWKTsKK30KKworc3RhdGljIHVpbnQzMl90IFFTUElfTVBDX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIG1wY19zaWVfaXJxX3N0YXRlKCZNUENfUVNQSV9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBRU1BJX01QQ19Mb2NrRG93bih2b2lkKQoreworICAgIHJldHVybiBtcGNfc2llX2xvY2tfZG93bigmTVBDX1FTUElfREVWKTsKK30KKworLyogUVNQSV9NUEMgRHJpdmVyIENNU0lTIGFjY2VzcyBzdHJ1Y3R1cmUgKi8KK0FSTV9EUklWRVJfTVBDIERyaXZlcl9RU1BJX01QQyA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICA9IEFSTV9NUENfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICA9IFFTUElfTVBDX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgPSBRU1BJX01QQ19VbmluaXRpYWxpemUsCisgICAgLkdldEJsb2NrU2l6ZSAgICAgPSBRU1BJX01QQ19HZXRCbG9ja1NpemUsCisgICAgLkdldEN0cmxDb25maWcgICAgPSBRU1BJX01QQ19HZXRDdHJsQ29uZmlnLAorICAgIC5TZXRDdHJsQ29uZmlnICAgID0gUVNQSV9NUENfU2V0Q3RybENvbmZpZywKKyAgICAuQ29uZmlnUmVnaW9uICAgICA9IFFTUElfTVBDX0NvbmZpZ1JlZ2lvbiwKKyAgICAuR2V0UmVnaW9uQ29uZmlnICA9IFFTUElfTVBDX0dldFJlZ2lvbkNvbmZpZywKKyAgICAuRW5hYmxlSW50ZXJydXB0ICA9IFFTUElfTVBDX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCA9IFFTUElfTVBDX0Rpc2FibGVJbnRlcnJ1cHQsCisgICAgLkNsZWFySW50ZXJydXB0ICAgPSBRU1BJX01QQ19DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICA9IFFTUElfTVBDX0ludGVycnVwdFN0YXRlLAorICAgIC5Mb2NrRG93biAgICAgICAgID0gUVNQSV9NUENfTG9ja0Rvd24sCit9OworI2VuZGlmIC8qIFJURV9RU1BJX01QQyAqLworCisjaWYgKFJURV9ERFI0X01QQykKKy8qIFJhbmdlcyBjb250cm9sbGVkIGJ5IHRoaXMgRERSNF9NUEMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCBNUENfRERSNF9SQU5HRV9TID0geworICAgIC5iYXNlICAgICAgICAgPSBNUENfRERSNF9SQU5HRV9CQVNFX1MsCisgICAgLmxpbWl0ICAgICAgICA9IE1QQ19ERFI0X1JBTkdFX0xJTUlUX1MsCisgICAgLnJhbmdlX29mZnNldCA9IDAsCisgICAgLmF0dHIgICAgICAgICA9IE1QQ19TSUVfU0VDX0FUVFJfU0VDVVJFCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QgTVBDX0REUjRfUkFOR0VfTlMgPSB7CisgICAgLmJhc2UgICAgICAgICA9IE1QQ19ERFI0X1JBTkdFX0JBU0VfTlMsCisgICAgLmxpbWl0ICAgICAgICA9IE1QQ19ERFI0X1JBTkdFX0xJTUlUX05TLAorICAgIC5yYW5nZV9vZmZzZXQgPSAwLAorICAgIC5hdHRyICAgICAgICAgPSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRQorfTsKKworI2RlZmluZSBNUENfRERSNF9SQU5HRV9MSVNUX0xFTiAgMnUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCoKKyAgICBNUENfRERSNF9SQU5HRV9MSVNUW01QQ19ERFI0X1JBTkdFX0xJU1RfTEVOXSA9IHsKKyAgICAgICAgJk1QQ19ERFI0X1JBTkdFX1MsCisgICAgICAgICZNUENfRERSNF9SQU5HRV9OUworICAgIH07CisKKy8qIEREUjRfTVBDIERyaXZlciB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludDMyX3QgRERSNF9NUENfSW5pdGlhbGl6ZSh2b2lkKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfaW5pdCgmTVBDX0REUjRfREVWLAorICAgICAgICAgICAgICAgICAgICAgICBNUENfRERSNF9SQU5HRV9MSVNULAorICAgICAgICAgICAgICAgICAgICAgICBNUENfRERSNF9SQU5HRV9MSVNUX0xFTik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBiZSBkb25lICovCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90IEREUjRfTVBDX0dldEJsb2NrU2l6ZSh1aW50MzJfdCAqYmxrX3NpemUpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9nZXRfYmxvY2tfc2l6ZSgmTVBDX0REUjRfREVWLCBibGtfc2l6ZSk7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfR2V0Q3RybENvbmZpZyh1aW50MzJfdCAqY3RybF92YWwpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9nZXRfY3RybCgmTVBDX0REUjRfREVWLCBjdHJsX3ZhbCk7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfU2V0Q3RybENvbmZpZyh1aW50MzJfdCBjdHJsKQoreworICAgIGVudW0gbXBjX3NpZV9lcnJvcl90IHJldDsKKworICAgIHJldCA9IG1wY19zaWVfc2V0X2N0cmwoJk1QQ19ERFI0X0RFViwgY3RybCk7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfR2V0UmVnaW9uQ29uZmlnKHVpbnRwdHJfdCBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNX01QQ19TRUNfQVRUUiAqYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBtcGNfc2llX2dldF9yZWdpb25fY29uZmlnKCZNUENfRERSNF9ERVYsIGJhc2UsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gbXBjX3NpZV9zZWNfYXR0cl90KilhdHRyKTsKKworICAgIHJldHVybiBlcnJvcl90cmFucyhyZXQpOworfQorCitzdGF0aWMgaW50MzJfdCBERFI0X01QQ19Db25maWdSZWdpb24odWludHB0cl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX1NFQ19BVFRSIGF0dHIpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9jb25maWdfcmVnaW9uKCZNUENfRERSNF9ERVYsIGJhc2UsIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBtcGNfc2llX3NlY19hdHRyX3QpYXR0cik7CisKKyAgICByZXR1cm4gZXJyb3JfdHJhbnMocmV0KTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfRW5hYmxlSW50ZXJydXB0KHZvaWQpCit7CisgICAgZW51bSBtcGNfc2llX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gbXBjX3NpZV9pcnFfZW5hYmxlKCZNUENfRERSNF9ERVYpOworCisgICAgcmV0dXJuIGVycm9yX3RyYW5zKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIEREUjRfTVBDX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBtcGNfc2llX2lycV9kaXNhYmxlKCZNUENfRERSNF9ERVYpOworfQorCisKK3N0YXRpYyB2b2lkIEREUjRfTVBDX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgbXBjX3NpZV9jbGVhcl9pcnEoJk1QQ19ERFI0X0RFVik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBERFI0X01QQ19JbnRlcnJ1cHRTdGF0ZSh2b2lkKQoreworICAgIHJldHVybiBtcGNfc2llX2lycV9zdGF0ZSgmTVBDX0REUjRfREVWKTsKK30KKworc3RhdGljIGludDMyX3QgRERSNF9NUENfTG9ja0Rvd24odm9pZCkKK3sKKyAgICByZXR1cm4gbXBjX3NpZV9sb2NrX2Rvd24oJk1QQ19ERFI0X0RFVik7Cit9CisKKy8qIEREUjRfTVBDIERyaXZlciBDTVNJUyBhY2Nlc3Mgc3RydWN0dXJlICovCitBUk1fRFJJVkVSX01QQyBEcml2ZXJfRERSNF9NUEMgPSB7CisgICAgLkdldFZlcnNpb24gICAgICAgPSBBUk1fTVBDX0dldFZlcnNpb24sCisgICAgLkluaXRpYWxpemUgICAgICAgPSBERFI0X01QQ19Jbml0aWFsaXplLAorICAgIC5VbmluaXRpYWxpemUgICAgID0gRERSNF9NUENfVW5pbml0aWFsaXplLAorICAgIC5HZXRCbG9ja1NpemUgICAgID0gRERSNF9NUENfR2V0QmxvY2tTaXplLAorICAgIC5HZXRDdHJsQ29uZmlnICAgID0gRERSNF9NUENfR2V0Q3RybENvbmZpZywKKyAgICAuU2V0Q3RybENvbmZpZyAgICA9IEREUjRfTVBDX1NldEN0cmxDb25maWcsCisgICAgLkNvbmZpZ1JlZ2lvbiAgICAgPSBERFI0X01QQ19Db25maWdSZWdpb24sCisgICAgLkdldFJlZ2lvbkNvbmZpZyAgPSBERFI0X01QQ19HZXRSZWdpb25Db25maWcsCisgICAgLkVuYWJsZUludGVycnVwdCAgPSBERFI0X01QQ19FbmFibGVJbnRlcnJ1cHQsCisgICAgLkRpc2FibGVJbnRlcnJ1cHQgPSBERFI0X01QQ19EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgID0gRERSNF9NUENfQ2xlYXJJbnRlcnJ1cHQsCisgICAgLkludGVycnVwdFN0YXRlICAgPSBERFI0X01QQ19JbnRlcnJ1cHRTdGF0ZSwKKyAgICAuTG9ja0Rvd24gICAgICAgICA9IEREUjRfTVBDX0xvY2tEb3duLAorfTsKKyNlbmRpZiAvKiBSVEVfRERSNF9NUEMgKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL0RyaXZlcl9QUEMuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL0RyaXZlcl9QUEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTVkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX1BQQy5jCkBAIC0wLDAgKzEsMTMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIEFybSBMaW1pdGVkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkRyaXZlcl9QUEMuaCIKKworI2luY2x1ZGUgIkRyaXZlcl9Db21tb24uaCIKKyNpbmNsdWRlICJjbXNpcy5oIgorI2luY2x1ZGUgImNtc2lzX2RyaXZlcl9jb25maWcuaCIKKyNpbmNsdWRlICJSVEVfRGV2aWNlLmgiCisjaW5jbHVkZSAicHBjX3BvbGFyaXNfZHJ2LmgiCisKKy8qIERyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIEFSTV9QUENfRFJWX1ZFUlNJT04gQVJNX0RSSVZFUl9WRVJTSU9OX01BSk9SX01JTk9SKDEsMCkKKworLyogRHJpdmVyIFZlcnNpb24gKi8KK3N0YXRpYyBjb25zdCBBUk1fRFJJVkVSX1ZFUlNJT04gRHJpdmVyVmVyc2lvbiA9IHsKKyAgICBBUk1fUFBDX0FQSV9WRVJTSU9OLAorICAgIEFSTV9QUENfRFJWX1ZFUlNJT04KK307CisKK0FSTV9EUklWRVJfVkVSU0lPTiBQUENfUE9MQVJJU19HZXRWZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIERyaXZlclZlcnNpb247Cit9CisKK3R5cGVkZWYgc3RydWN0IF9QT0xBUklTX1BQQ19SZXNvdXJjZXMgeworICAgIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2OyAgICAgICAvKiBQUEMgZGV2aWNlIHN0cnVjdHVyZSAqLworfSBQT0xBUklTX1BQQ19SZXNvdXJjZXM7CisKKyNpZiAoUlRFX1BQQ19QT0xBUklTX01BSU4wKQorCitzdGF0aWMgUE9MQVJJU19QUENfUmVzb3VyY2VzIE1BSU4wX1BQQ19ERVYgPSB7CisgICAgLmRldiA9ICZQUENfUE9MQVJJU19NQUlOMF9ERVYsCit9OworCisvKiBNQUlOMCBQUEMgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBQUENfUE9MQVJJU19NQUlOMF9Jbml0aWFsaXplKHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfaW5pdChNQUlOMF9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTjBfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfTUFJTjBfQ29uZmlnUHJpdmlsZWdlKHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19Qcml2QXR0ciBwcml2X2F0dHIpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2UoTUFJTjBfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QpcHJpdl9hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX01BSU4wX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KE1BSU4wX1BQQ19ERVYuZGV2LCBwZXJpcGgpOworfQorCisvKiBTZWN1cmUgb25seSBmdW5jdGlvbnMgKi8KKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX01BSU4wX0NvbmZpZ1NlY3VyaXR5KHVpbnQzMl90IHBlcmlwaCwgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KE1BSU4wX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19NQUlOMF9Jc1BlcmlwaFNlY3VyZSh1aW50MzJfdCBwZXJpcGgpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoTUFJTjBfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX01BSU4wX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKE1BSU4wX1BQQ19ERVYuZGV2KTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX01BSU4wX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShNQUlOMF9QUENfREVWLmRldik7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX01BSU4wX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKE1BSU4wX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTjBfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXJxX3N0YXRlKE1BSU4wX1BQQ19ERVYuZGV2KTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworCisvKiBQUEMgUG9sYXJpcyBNQUlOMCBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19NQUlOMCA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICAgPSBQUENfUE9MQVJJU19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgICA9IFBQQ19QT0xBUklTX01BSU4wX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgID0gUFBDX1BPTEFSSVNfTUFJTjBfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX01BSU4wX0NvbmZpZ1ByaXZpbGVnZSwKKyAgICAuSXNQZXJpcGhQcml2T25seSAgPSBQUENfUE9MQVJJU19NQUlOMF9Jc1BlcmlwaFByaXZPbmx5LAorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgIC5Db25maWdTZWN1cml0eSAgICA9IFBQQ19QT0xBUklTX01BSU4wX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX01BSU4wX0lzUGVyaXBoU2VjdXJlLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgICA9IFBQQ19QT0xBUklTX01BSU4wX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCAgPSBQUENfUE9MQVJJU19NQUlOMF9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX01BSU4wX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgICA9IFBQQ19QT0xBUklTX01BSU4wX0ludGVycnVwdFN0YXRlCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCit9OworI2VuZGlmIC8qIFJURV9QUENfUE9MQVJJU19NQUlOMCAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19NQUlOX0VYUDApCisKK3N0YXRpYyBQT0xBUklTX1BQQ19SZXNvdXJjZXMgTUFJTl9FWFAwX1BQQ19ERVYgPSB7CisgICAgLmRldiA9ICZQUENfUE9MQVJJU19NQUlOX0VYUDBfREVWLAorfTsKKworLyogTUFJTiBQUENFWFAwIERyaXZlciB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0luaXRpYWxpemUodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pbml0KE1BSU5fRVhQMF9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX01BSU5fRVhQMF9Db25maWdQcml2aWxlZ2UodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfUHJpdkF0dHIgcHJpdl9hdHRyKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19jb25maWdfcHJpdmlsZWdlKE1BSU5fRVhQMF9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdClwcml2X2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KE1BSU5fRVhQMF9QUENfREVWLmRldiwgcGVyaXBoKTsKK30KKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19NQUlOX0VYUDBfQ29uZmlnU2VjdXJpdHkodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KE1BSU5fRVhQMF9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0lzUGVyaXBoU2VjdXJlKHVpbnQzMl90IHBlcmlwaCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3NlY3VyZShNQUlOX0VYUDBfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX01BSU5fRVhQMF9FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfaXJxX2VuYWJsZShNQUlOX0VYUDBfUFBDX0RFVi5kZXYpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShNQUlOX0VYUDBfUFBDX0RFVi5kZXYpOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19NQUlOX0VYUDBfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19jbGVhcl9pcnEoTUFJTl9FWFAwX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lycV9zdGF0ZShNQUlOX0VYUDBfUFBDX0RFVi5kZXYpOworfQorCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCisKKy8qIFBQQyBQb2xhcmlzIE1BSU4gRVhQMCBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDAgPSB7CisgICAgLkdldFZlcnNpb24gICAgICAgID0gUFBDX1BPTEFSSVNfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDBfSW5pdGlhbGl6ZSwKKyAgICAuVW5pbml0aWFsaXplICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDBfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMF9Db25maWdQcml2aWxlZ2UsCisgICAgLklzUGVyaXBoUHJpdk9ubHkgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0lzUGVyaXBoUHJpdk9ubHksCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisgICAgLkNvbmZpZ1NlY3VyaXR5ICAgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMF9Jc1BlcmlwaFNlY3VyZSwKKyAgICAuRW5hYmxlSW50ZXJydXB0ICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDBfRW5hYmxlSW50ZXJydXB0LAorICAgIC5EaXNhYmxlSW50ZXJydXB0ICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMF9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMF9DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDBfSW50ZXJydXB0U3RhdGUKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KK307CisjZW5kaWYgLyogUlRFX1BQQ19QT0xBUklTX01BSU5fRVhQMCAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19NQUlOX0VYUDEpCisKK3N0YXRpYyBQT0xBUklTX1BQQ19SZXNvdXJjZXMgTUFJTl9FWFAxX1BQQ19ERVYgPSB7CisgICAgLmRldiA9ICZQUENfUE9MQVJJU19NQUlOX0VYUDFfREVWLAorfTsKKworLyogTUFJTiBQUENFWFAxIERyaXZlciB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0luaXRpYWxpemUodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pbml0KE1BSU5fRVhQMV9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX01BSU5fRVhQMV9Db25maWdQcml2aWxlZ2UodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfUHJpdkF0dHIgcHJpdl9hdHRyKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19jb25maWdfcHJpdmlsZWdlKE1BSU5fRVhQMV9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdClwcml2X2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KE1BSU5fRVhQMV9QUENfREVWLmRldiwgcGVyaXBoKTsKK30KKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19NQUlOX0VYUDFfQ29uZmlnU2VjdXJpdHkodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KE1BSU5fRVhQMV9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0lzUGVyaXBoU2VjdXJlKHVpbnQzMl90IHBlcmlwaCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3NlY3VyZShNQUlOX0VYUDFfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX01BSU5fRVhQMV9FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfaXJxX2VuYWJsZShNQUlOX0VYUDFfUFBDX0RFVi5kZXYpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShNQUlOX0VYUDFfUFBDX0RFVi5kZXYpOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19NQUlOX0VYUDFfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19jbGVhcl9pcnEoTUFJTl9FWFAxX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lycV9zdGF0ZShNQUlOX0VYUDFfUFBDX0RFVi5kZXYpOworfQorCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCisKKy8qIFBQQyBQb2xhcmlzIE1BSU4gRVhQMSBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDEgPSB7CisgICAgLkdldFZlcnNpb24gICAgICAgID0gUFBDX1BPTEFSSVNfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDFfSW5pdGlhbGl6ZSwKKyAgICAuVW5pbml0aWFsaXplICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDFfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMV9Db25maWdQcml2aWxlZ2UsCisgICAgLklzUGVyaXBoUHJpdk9ubHkgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0lzUGVyaXBoUHJpdk9ubHksCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisgICAgLkNvbmZpZ1NlY3VyaXR5ICAgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMV9Jc1BlcmlwaFNlY3VyZSwKKyAgICAuRW5hYmxlSW50ZXJydXB0ICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDFfRW5hYmxlSW50ZXJydXB0LAorICAgIC5EaXNhYmxlSW50ZXJydXB0ICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMV9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMV9DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDFfSW50ZXJydXB0U3RhdGUKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KK307CisjZW5kaWYgLyogUlRFX1BQQ19QT0xBUklTX01BSU5fRVhQMSAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19NQUlOX0VYUDIpCisKK3N0YXRpYyBQT0xBUklTX1BQQ19SZXNvdXJjZXMgTUFJTl9FWFAyX1BQQ19ERVYgPSB7CisgICAgLmRldiA9ICZQUENfUE9MQVJJU19NQUlOX0VYUDJfREVWLAorfTsKKworLyogTUFJTiBQUENFWFAyIERyaXZlciB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0luaXRpYWxpemUodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pbml0KE1BSU5fRVhQMl9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX01BSU5fRVhQMl9Db25maWdQcml2aWxlZ2UodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfUHJpdkF0dHIgcHJpdl9hdHRyKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19jb25maWdfcHJpdmlsZWdlKE1BSU5fRVhQMl9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdClwcml2X2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KE1BSU5fRVhQMl9QUENfREVWLmRldiwgcGVyaXBoKTsKK30KKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19NQUlOX0VYUDJfQ29uZmlnU2VjdXJpdHkodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KE1BSU5fRVhQMl9QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0lzUGVyaXBoU2VjdXJlKHVpbnQzMl90IHBlcmlwaCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3NlY3VyZShNQUlOX0VYUDJfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX01BSU5fRVhQMl9FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfaXJxX2VuYWJsZShNQUlOX0VYUDJfUFBDX0RFVi5kZXYpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShNQUlOX0VYUDJfUFBDX0RFVi5kZXYpOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19NQUlOX0VYUDJfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19jbGVhcl9pcnEoTUFJTl9FWFAyX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lycV9zdGF0ZShNQUlOX0VYUDJfUFBDX0RFVi5kZXYpOworfQorCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCisKKy8qIFBQQyBQb2xhcmlzIE1BSU4gRVhQMiBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDIgPSB7CisgICAgLkdldFZlcnNpb24gICAgICAgID0gUFBDX1BPTEFSSVNfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDJfSW5pdGlhbGl6ZSwKKyAgICAuVW5pbml0aWFsaXplICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDJfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMl9Db25maWdQcml2aWxlZ2UsCisgICAgLklzUGVyaXBoUHJpdk9ubHkgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0lzUGVyaXBoUHJpdk9ubHksCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisgICAgLkNvbmZpZ1NlY3VyaXR5ICAgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMl9Jc1BlcmlwaFNlY3VyZSwKKyAgICAuRW5hYmxlSW50ZXJydXB0ICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDJfRW5hYmxlSW50ZXJydXB0LAorICAgIC5EaXNhYmxlSW50ZXJydXB0ICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMl9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQMl9DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDJfSW50ZXJydXB0U3RhdGUKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KK307CisjZW5kaWYgLyogUlRFX1BQQ19QT0xBUklTX01BSU5fRVhQMiAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19NQUlOX0VYUDMpCisKK3N0YXRpYyBQT0xBUklTX1BQQ19SZXNvdXJjZXMgTUFJTl9FWFAzX1BQQ19ERVYgPSB7CisgICAgLmRldiA9ICZQUENfUE9MQVJJU19NQUlOX0VYUDNfREVWLAorfTsKKworLyogTUFJTiBQUENFWFAzIERyaXZlciB3cmFwcGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0luaXRpYWxpemUodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pbml0KE1BSU5fRVhQM19QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX01BSU5fRVhQM19Db25maWdQcml2aWxlZ2UodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfUHJpdkF0dHIgcHJpdl9hdHRyKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19jb25maWdfcHJpdmlsZWdlKE1BSU5fRVhQM19QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdClwcml2X2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KE1BSU5fRVhQM19QUENfREVWLmRldiwgcGVyaXBoKTsKK30KKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19NQUlOX0VYUDNfQ29uZmlnU2VjdXJpdHkodWludDMyX3QgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KE1BSU5fRVhQM19QUENfREVWLmRldiwgcGVyaXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0lzUGVyaXBoU2VjdXJlKHVpbnQzMl90IHBlcmlwaCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3NlY3VyZShNQUlOX0VYUDNfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX01BSU5fRVhQM19FbmFibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfaXJxX2VuYWJsZShNQUlOX0VYUDNfUFBDX0RFVi5kZXYpOworCisgICAgaWYoIHJldCAhPSBQUENfUE9MQVJJU19FUlJfTk9ORSkgeworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShNQUlOX0VYUDNfUFBDX0RFVi5kZXYpOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19NQUlOX0VYUDNfQ2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19jbGVhcl9pcnEoTUFJTl9FWFAzX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0ludGVycnVwdFN0YXRlKHZvaWQpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lycV9zdGF0ZShNQUlOX0VYUDNfUFBDX0RFVi5kZXYpOworfQorCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCisKKy8qIFBQQyBQb2xhcmlzIE1BSU4gRVhQMyBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDMgPSB7CisgICAgLkdldFZlcnNpb24gICAgICAgID0gUFBDX1BPTEFSSVNfR2V0VmVyc2lvbiwKKyAgICAuSW5pdGlhbGl6ZSAgICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDNfSW5pdGlhbGl6ZSwKKyAgICAuVW5pbml0aWFsaXplICAgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDNfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQM19Db25maWdQcml2aWxlZ2UsCisgICAgLklzUGVyaXBoUHJpdk9ubHkgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0lzUGVyaXBoUHJpdk9ubHksCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisgICAgLkNvbmZpZ1NlY3VyaXR5ICAgID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQM19Jc1BlcmlwaFNlY3VyZSwKKyAgICAuRW5hYmxlSW50ZXJydXB0ICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDNfRW5hYmxlSW50ZXJydXB0LAorICAgIC5EaXNhYmxlSW50ZXJydXB0ICA9IFBQQ19QT0xBUklTX01BSU5fRVhQM19EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX01BSU5fRVhQM19DbGVhckludGVycnVwdCwKKyAgICAuSW50ZXJydXB0U3RhdGUgICAgPSBQUENfUE9MQVJJU19NQUlOX0VYUDNfSW50ZXJydXB0U3RhdGUKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KK307CisjZW5kaWYgLyogUlRFX1BQQ19QT0xBUklTX01BSU5fRVhQMyAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEgwKQorCitzdGF0aWMgUE9MQVJJU19QUENfUmVzb3VyY2VzIFBFUklQSDBfUFBDX0RFViA9IHsKKyAgICAuZGV2ID0gJlBQQ19QT0xBUklTX1BFUklQSDBfREVWLAorfTsKKworLyogUEVSSVBIMCBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSDBfSW5pdGlhbGl6ZSh2b2lkKQoreworICAgIHBwY19wb2xhcmlzX2luaXQoUEVSSVBIMF9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIMF9VbmluaXRpYWxpemUodm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19QRVJJUEgwX0NvbmZpZ1ByaXZpbGVnZSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1ByaXZBdHRyIHByaXZfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3ByaXZpbGVnZShQRVJJUEgwX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3ByaXZfYXR0cl90KXByaXZfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEgwX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSDBfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKKy8qIFNlY3VyZSBvbmx5IGZ1bmN0aW9ucyAqLworI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIMF9Db25maWdTZWN1cml0eSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSDBfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSDBfSXNQZXJpcGhTZWN1cmUodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfc2VjdXJlKFBFUklQSDBfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSDBfRW5hYmxlSW50ZXJydXB0KHZvaWQpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2lycV9lbmFibGUoUEVSSVBIMF9QUENfREVWLmRldik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19QRVJJUEgwX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEgwX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfUEVSSVBIMF9DbGVhckludGVycnVwdCh2b2lkKQoreworICAgIHBwY19wb2xhcmlzX2NsZWFyX2lycShQRVJJUEgwX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIMF9JbnRlcnJ1cHRTdGF0ZSh2b2lkKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pcnFfc3RhdGUoUEVSSVBIMF9QUENfREVWLmRldik7Cit9CisKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KKworLyogUFBDIFBvbGFyaXMgUEVSSVBIMCBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEgwID0geworICAgIC5HZXRWZXJzaW9uICAgICAgICA9IFBQQ19QT0xBUklTX0dldFZlcnNpb24sCisgICAgLkluaXRpYWxpemUgICAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMF9Jbml0aWFsaXplLAorICAgIC5VbmluaXRpYWxpemUgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSDBfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSDBfQ29uZmlnUHJpdmlsZWdlLAorICAgIC5Jc1BlcmlwaFByaXZPbmx5ICA9IFBQQ19QT0xBUklTX1BFUklQSDBfSXNQZXJpcGhQcml2T25seSwKKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKyAgICAuQ29uZmlnU2VjdXJpdHkgICAgPSBQUENfUE9MQVJJU19QRVJJUEgwX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSDBfSXNQZXJpcGhTZWN1cmUsCisgICAgLkVuYWJsZUludGVycnVwdCAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMF9FbmFibGVJbnRlcnJ1cHQsCisgICAgLkRpc2FibGVJbnRlcnJ1cHQgID0gUFBDX1BPTEFSSVNfUEVSSVBIMF9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSDBfQ2xlYXJJbnRlcnJ1cHQsCisgICAgLkludGVycnVwdFN0YXRlICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMF9JbnRlcnJ1cHRTdGF0ZQorI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworfTsKKyNlbmRpZiAvKiBSVEVfUFBDX1BPTEFSSVNfUEVSSVBIMCAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEgxKQorCitzdGF0aWMgUE9MQVJJU19QUENfUmVzb3VyY2VzIFBFUklQSDFfUFBDX0RFViA9IHsKKyAgICAuZGV2ID0gJlBQQ19QT0xBUklTX1BFUklQSDFfREVWLAorfTsKKworLyogUEVSSVBIMSBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSDFfSW5pdGlhbGl6ZSh2b2lkKQoreworICAgIHBwY19wb2xhcmlzX2luaXQoUEVSSVBIMV9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIMV9VbmluaXRpYWxpemUodm9pZCkKK3sKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBpbnQzMl90CitQUENfUE9MQVJJU19QRVJJUEgxX0NvbmZpZ1ByaXZpbGVnZSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1ByaXZBdHRyIHByaXZfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3ByaXZpbGVnZShQRVJJUEgxX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qpc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtIHBwY19wb2xhcmlzX3ByaXZfYXR0cl90KXByaXZfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEgxX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSDFfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKKy8qIFNlY3VyZSBvbmx5IGZ1bmN0aW9ucyAqLworI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIMV9Db25maWdTZWN1cml0eSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSDFfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90KXNlY19hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSDFfSXNQZXJpcGhTZWN1cmUodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfc2VjdXJlKFBFUklQSDFfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSDFfRW5hYmxlSW50ZXJydXB0KHZvaWQpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2lycV9lbmFibGUoUEVSSVBIMV9QUENfREVWLmRldik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgdm9pZCBQUENfUE9MQVJJU19QRVJJUEgxX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEgxX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIHZvaWQgUFBDX1BPTEFSSVNfUEVSSVBIMV9DbGVhckludGVycnVwdCh2b2lkKQoreworICAgIHBwY19wb2xhcmlzX2NsZWFyX2lycShQRVJJUEgxX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIMV9JbnRlcnJ1cHRTdGF0ZSh2b2lkKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pcnFfc3RhdGUoUEVSSVBIMV9QUENfREVWLmRldik7Cit9CisKKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KKworLyogUFBDIFBvbGFyaXMgUEVSSVBIMSBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEgxID0geworICAgIC5HZXRWZXJzaW9uICAgICAgICA9IFBQQ19QT0xBUklTX0dldFZlcnNpb24sCisgICAgLkluaXRpYWxpemUgICAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMV9Jbml0aWFsaXplLAorICAgIC5VbmluaXRpYWxpemUgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSDFfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSDFfQ29uZmlnUHJpdmlsZWdlLAorICAgIC5Jc1BlcmlwaFByaXZPbmx5ICA9IFBQQ19QT0xBUklTX1BFUklQSDFfSXNQZXJpcGhQcml2T25seSwKKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKyAgICAuQ29uZmlnU2VjdXJpdHkgICAgPSBQUENfUE9MQVJJU19QRVJJUEgxX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSDFfSXNQZXJpcGhTZWN1cmUsCisgICAgLkVuYWJsZUludGVycnVwdCAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMV9FbmFibGVJbnRlcnJ1cHQsCisgICAgLkRpc2FibGVJbnRlcnJ1cHQgID0gUFBDX1BPTEFSSVNfUEVSSVBIMV9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSDFfQ2xlYXJJbnRlcnJ1cHQsCisgICAgLkludGVycnVwdFN0YXRlICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIMV9JbnRlcnJ1cHRTdGF0ZQorI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworfTsKKyNlbmRpZiAvKiBSVEVfUFBDX1BPTEFSSVNfUEVSSVBIMSAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMCkKKworc3RhdGljIFBPTEFSSVNfUFBDX1Jlc291cmNlcyBQRVJJUEhfRVhQMF9QUENfREVWID0geworICAgIC5kZXYgPSAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfREVWLAorfTsKKworLyogUEVSSVBIIFBQQ0VYUDAgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9Jbml0aWFsaXplKHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfaW5pdChQRVJJUEhfRVhQMF9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfQ29uZmlnUHJpdmlsZWdlKHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19Qcml2QXR0ciBwcml2X2F0dHIpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2UoUEVSSVBIX0VYUDBfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QpcHJpdl9hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSF9FWFAwX1BQQ19ERVYuZGV2LCBwZXJpcGgpOworfQorCisvKiBTZWN1cmUgb25seSBmdW5jdGlvbnMgKi8KKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX1BFUklQSF9FWFAwX0NvbmZpZ1NlY3VyaXR5KHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSF9FWFAwX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9Jc1BlcmlwaFNlY3VyZSh1aW50MzJfdCBwZXJpcGgpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoUEVSSVBIX0VYUDBfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKFBFUklQSF9FWFAwX1BQQ19ERVYuZGV2KTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEhfRVhQMF9QUENfREVWLmRldik7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKFBFUklQSF9FWFAwX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXJxX3N0YXRlKFBFUklQSF9FWFAwX1BQQ19ERVYuZGV2KTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworCisvKiBQUEMgUG9sYXJpcyBQRVJJUEggRVhQMCBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMCA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICAgPSBQUENfUE9MQVJJU19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0NvbmZpZ1ByaXZpbGVnZSwKKyAgICAuSXNQZXJpcGhQcml2T25seSAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9Jc1BlcmlwaFByaXZPbmx5LAorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgIC5Db25maWdTZWN1cml0eSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0lzUGVyaXBoU2VjdXJlLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0ludGVycnVwdFN0YXRlCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCit9OworI2VuZGlmIC8qIFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMCAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMSkKKworc3RhdGljIFBPTEFSSVNfUFBDX1Jlc291cmNlcyBQRVJJUEhfRVhQMV9QUENfREVWID0geworICAgIC5kZXYgPSAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfREVWLAorfTsKKworLyogUEVSSVBIIFBQQ0VYUDEgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9Jbml0aWFsaXplKHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfaW5pdChQRVJJUEhfRVhQMV9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfQ29uZmlnUHJpdmlsZWdlKHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19Qcml2QXR0ciBwcml2X2F0dHIpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2UoUEVSSVBIX0VYUDFfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QpcHJpdl9hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSF9FWFAxX1BQQ19ERVYuZGV2LCBwZXJpcGgpOworfQorCisvKiBTZWN1cmUgb25seSBmdW5jdGlvbnMgKi8KKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NvbmZpZ1NlY3VyaXR5KHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSF9FWFAxX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9Jc1BlcmlwaFNlY3VyZSh1aW50MzJfdCBwZXJpcGgpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoUEVSSVBIX0VYUDFfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKFBFUklQSF9FWFAxX1BQQ19ERVYuZGV2KTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEhfRVhQMV9QUENfREVWLmRldik7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKFBFUklQSF9FWFAxX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXJxX3N0YXRlKFBFUklQSF9FWFAxX1BQQ19ERVYuZGV2KTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworCisvKiBQUEMgUG9sYXJpcyBQRVJJUEggRVhQMSBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMSA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICAgPSBQUENfUE9MQVJJU19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NvbmZpZ1ByaXZpbGVnZSwKKyAgICAuSXNQZXJpcGhQcml2T25seSAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9Jc1BlcmlwaFByaXZPbmx5LAorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgIC5Db25maWdTZWN1cml0eSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0lzUGVyaXBoU2VjdXJlLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0ludGVycnVwdFN0YXRlCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCit9OworI2VuZGlmIC8qIFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMSAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMikKKworc3RhdGljIFBPTEFSSVNfUFBDX1Jlc291cmNlcyBQRVJJUEhfRVhQMl9QUENfREVWID0geworICAgIC5kZXYgPSAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfREVWLAorfTsKKworLyogUEVSSVBIIFBQQ0VYUDIgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9Jbml0aWFsaXplKHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfaW5pdChQRVJJUEhfRVhQMl9QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfQ29uZmlnUHJpdmlsZWdlKHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19Qcml2QXR0ciBwcml2X2F0dHIpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2UoUEVSSVBIX0VYUDJfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QpcHJpdl9hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSF9FWFAyX1BQQ19ERVYuZGV2LCBwZXJpcGgpOworfQorCisvKiBTZWN1cmUgb25seSBmdW5jdGlvbnMgKi8KKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NvbmZpZ1NlY3VyaXR5KHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSF9FWFAyX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9Jc1BlcmlwaFNlY3VyZSh1aW50MzJfdCBwZXJpcGgpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoUEVSSVBIX0VYUDJfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKFBFUklQSF9FWFAyX1BQQ19ERVYuZGV2KTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEhfRVhQMl9QUENfREVWLmRldik7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKFBFUklQSF9FWFAyX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXJxX3N0YXRlKFBFUklQSF9FWFAyX1BQQ19ERVYuZGV2KTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworCisvKiBQUEMgUG9sYXJpcyBQRVJJUEggRVhQMiBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMiA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICAgPSBQUENfUE9MQVJJU19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NvbmZpZ1ByaXZpbGVnZSwKKyAgICAuSXNQZXJpcGhQcml2T25seSAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9Jc1BlcmlwaFByaXZPbmx5LAorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgIC5Db25maWdTZWN1cml0eSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0lzUGVyaXBoU2VjdXJlLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0ludGVycnVwdFN0YXRlCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCit9OworI2VuZGlmIC8qIFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMiAqLworCisjaWYgKFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMykKKworc3RhdGljIFBPTEFSSVNfUFBDX1Jlc291cmNlcyBQRVJJUEhfRVhQM19QUENfREVWID0geworICAgIC5kZXYgPSAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfREVWLAorfTsKKworLyogUEVSSVBIIFBQQ0VYUDMgRHJpdmVyIHdyYXBwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50MzJfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19Jbml0aWFsaXplKHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfaW5pdChQRVJJUEhfRVhQM19QUENfREVWLmRldik7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfVW5pbml0aWFsaXplKHZvaWQpCit7CisgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdAorUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfQ29uZmlnUHJpdmlsZWdlKHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19Qcml2QXR0ciBwcml2X2F0dHIpCit7CisgICAgZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHJldDsKKworICAgIHJldCA9IHBwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2UoUEVSSVBIX0VYUDNfUFBDX0RFVi5kZXYsIHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QpcHJpdl9hdHRyKTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyBib29sIFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0lzUGVyaXBoUHJpdk9ubHkodWludDMyX3QgcGVyaXBoKQoreworICAgIHJldHVybiBwcGNfcG9sYXJpc19pc19wZXJpcGhfcHJpdl9vbmx5KFBFUklQSF9FWFAzX1BQQ19ERVYuZGV2LCBwZXJpcGgpOworfQorCisvKiBTZWN1cmUgb25seSBmdW5jdGlvbnMgKi8KKyNpZiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkKKworc3RhdGljIGludDMyX3QKK1BQQ19QT0xBUklTX1BFUklQSF9FWFAzX0NvbmZpZ1NlY3VyaXR5KHVpbnQzMl90IHBlcmlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKK3sKKyAgICBlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcmV0OworCisgICAgcmV0ID0gcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KFBFUklQSF9FWFAzX1BQQ19ERVYuZGV2LCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudW0gcHBjX3BvbGFyaXNfc2VjX2F0dHJfdClzZWNfYXR0cik7CisKKyAgICBpZiggcmV0ICE9IFBQQ19QT0xBUklTX0VSUl9OT05FKSB7CisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgYm9vbCBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19Jc1BlcmlwaFNlY3VyZSh1aW50MzJfdCBwZXJpcGgpCit7CisgICAgcmV0dXJuIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoUEVSSVBIX0VYUDNfUFBDX0RFVi5kZXYsIHBlcmlwaCk7Cit9CisKK3N0YXRpYyBpbnQzMl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0VuYWJsZUludGVycnVwdCh2b2lkKQoreworICAgIGVudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCByZXQ7CisKKyAgICByZXQgPSBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKFBFUklQSF9FWFAzX1BQQ19ERVYuZGV2KTsKKworICAgIGlmKCByZXQgIT0gUFBDX1BPTEFSSVNfRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0Rpc2FibGVJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShQRVJJUEhfRVhQM19QUENfREVWLmRldik7Cit9CisKK3N0YXRpYyB2b2lkIFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0NsZWFySW50ZXJydXB0KHZvaWQpCit7CisgICAgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKFBFUklQSF9FWFAzX1BQQ19ERVYuZGV2KTsKK30KKworc3RhdGljIGJvb2wgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfSW50ZXJydXB0U3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gcHBjX3BvbGFyaXNfaXJxX3N0YXRlKFBFUklQSF9FWFAzX1BQQ19ERVYuZGV2KTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLworCisvKiBQUEMgUG9sYXJpcyBQRVJJUEggRVhQMyBEcml2ZXIgQ01TSVMgYWNjZXNzIHN0cnVjdHVyZSAqLworRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMyA9IHsKKyAgICAuR2V0VmVyc2lvbiAgICAgICAgPSBQUENfUE9MQVJJU19HZXRWZXJzaW9uLAorICAgIC5Jbml0aWFsaXplICAgICAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0luaXRpYWxpemUsCisgICAgLlVuaW5pdGlhbGl6ZSAgICAgID0gUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfVW5pbml0aWFsaXplLAorICAgIC5Db25maWdQcml2aWxlZ2UgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0NvbmZpZ1ByaXZpbGVnZSwKKyAgICAuSXNQZXJpcGhQcml2T25seSAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19Jc1BlcmlwaFByaXZPbmx5LAorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgIC5Db25maWdTZWN1cml0eSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0NvbmZpZ1NlY3VyaXR5LAorICAgIC5Jc1BlcmlwaFNlY3VyZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0lzUGVyaXBoU2VjdXJlLAorICAgIC5FbmFibGVJbnRlcnJ1cHQgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0VuYWJsZUludGVycnVwdCwKKyAgICAuRGlzYWJsZUludGVycnVwdCAgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19EaXNhYmxlSW50ZXJydXB0LAorICAgIC5DbGVhckludGVycnVwdCAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0NsZWFySW50ZXJydXB0LAorICAgIC5JbnRlcnJ1cHRTdGF0ZSAgICA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0ludGVycnVwdFN0YXRlCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCit9OworI2VuZGlmIC8qIFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX1BQQy5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX1BQQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YThkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9Ecml2ZXJfUFBDLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19QUENfUE9MQVJJU19EUklWRVJfSF9fCisjZGVmaW5lIF9fUFBDX1BPTEFSSVNfRFJJVkVSX0hfXworCisjaW5jbHVkZSAiRHJpdmVyX0NvbW1vbi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEFQSSB2ZXJzaW9uICovCisjZGVmaW5lIEFSTV9QUENfQVBJX1ZFUlNJT04gQVJNX0RSSVZFUl9WRVJTSU9OX01BSk9SX01JTk9SKDEsMCkKKworLyogU2VjdXJpdHkgYXR0cmlidXRlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsICovCit0eXBlZGVmIGVudW0gX1BQQ19QT0xBUklTX1NlY0F0dHIgeworICAgIFBQQ19QT0xBUklTX1NFQ1VSRV9DT05GSUcgPSAwLCAgICAvKiE8IFNlY3VyZSBhY2Nlc3MgKi8KKyAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHLCAgICAgLyohPCBOb24tc2VjdXJlIGFjY2VzcyAqLworfSBQUENfUE9MQVJJU19TZWNBdHRyOworCisvKiBQcml2aWxlZ2UgYXR0cmlidXRlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwZXJpcGhlcmFsICovCit0eXBlZGVmIGVudW0gX1BQQ19QT0xBUklTX1ByaXZBdHRyIHsKKyAgICBQUENfUE9MQVJJU19QUklWX0FORF9OT05QUklWX0NPTkZJRyA9IDAsIC8qITwgUHJpdmlsZWdlIGFuZCBub24tcHJpdmlsZWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFjY2VzcyAqLworICAgIFBQQ19QT0xBUklTX1BSSVZfQ09ORklHLCAgICAgICAgICAgICAgICAgLyohPCBQcml2aWxlZ2Ugb25seSBhY2Nlc3MgKi8KK30gUFBDX1BPTEFSSVNfUHJpdkF0dHI7CisKKy8qIEZ1bmN0aW9uIGRlc2NyaXB0aW9ucyAqLworLyoqCisgIFNBQ0ZHICAtIFNlY3VyZSBQcml2aWxlZ2UgQ29udHJvbCBCbG9jaworICBOU0FDRkcgLSBOb24tU2VjdXJlIFByaXZpbGVnZSBDb250cm9sIEJsb2NrCisKKyAgXGZuICAgICAgICAgIEFSTV9EUklWRVJfVkVSU0lPTiBQUENfUE9MQVJJU19HZXRWZXJzaW9uKHZvaWQpCisgIFxicmllZiAgICAgICBHZXQgZHJpdmVyIHZlcnNpb24uCisgIFxyZXR1cm4gICAgICBccmVmIEFSTV9EUklWRVJfVkVSU0lPTgorCisgIFxmbiAgICAgICAgICBpbnQzMl90IFBQQ19QT0xBUklTX0luaXRpYWxpemUodm9pZCkKKyAgXGJyaWVmICAgICAgIEluaXRpYWxpemVzIFBQQyBJbnRlcmZhY2UuCisgIFxyZXR1cm4gICAgICBSZXR1cm5zIFBvbGFyaXMgUFBDIGVycm9yIGNvZGUuCisKKyAgXGZuICAgICAgICAgIGludDMyX3QgUFBDX1BPTEFSSVNfVW5pbml0aWFsaXplKHZvaWQpCisgIFxicmllZiAgICAgICBEZS1pbml0aWFsaXplcyBQUEMgSW50ZXJmYWNlLgorICBccmV0dXJuICAgICAgUmV0dXJucyBQb2xhcmlzIFBQQyBlcnJvciBjb2RlLgorCisgIFxmbiAgICAgICAgICBpbnQzMl90IFBQQ19QT0xBUklTX0NvbmZpZ1ByaXZpbGVnZSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1NlY0F0dHIgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1ByaXZBdHRyIHByaXZfYXR0cikKKyAgXGJyaWVmICAgICAgIENvbmZpZ3VyZXMgcHJpdmlsZWdlIGxldmVsIHdpdGggcHJpdmlsZWdlZCBhbmQgdW5wcml2aWxlZ2VkCisgICAgICAgICAgICAgICBhY2Nlc3Mgb3IgcHJpdmlsZWdlZCBhY2Nlc3Mgb25seSBpbiB0aGUgZ2l2ZW4gc2VjdXJpdHkgZG9tYWluCisgICAgICAgICAgICAgICBmb3IgYSBwZXJpcGhlcmFsIGNvbnRyb2xsZWQgYnkgdGhlIGdpdmVuIFBQQy4KKyAgXHBhcmFtW2luXSAgIHBlcmlwaDogICAgIFBlcmlwaGVyYWwgbWFzayBmb3IgU0FDRkcgYW5kIE5TQUNGRyByZWdpc3RlcnMuCisgIFxwYXJhbVtpbl0gICBzZWNfYXR0cjogICBTcGVjaWZpZXMgU2VjdXJlIG9yIE5vbiBTZWN1cmUgZG9tYWluLgorICBccGFyYW1baW5dICAgcHJpdl9hdHRyOiAgUHJpdmlsZWdlIGF0dHJpYnV0ZSB2YWx1ZSB0byBzZXQuCisgIFxyZXR1cm4gICAgICBSZXR1cm5zIFBvbGFyaXMgUFBDIGVycm9yIGNvZGUuCisKKyAgXGZuICAgICAgICAgIGJvb2wgUFBDX1BPTEFSSVNfSXNQZXJpcGhQcml2T25seSAodWludDMyX3QgcGVyaXBoKQorICBcYnJpZWYgICAgICAgQ2hlY2tzIGlmIHRoZSBwZXJpcGhlcmFsIGlzIGNvbmZpZ3VyZWQgdG8gYmUgcHJpdmlsZWdlIG9ubHkKKyAgICAgICAgICAgICAgICAtIHdpdGggbm9uLXNlY3VyZSBjYWxsZXIgaW4gdGhlIG5vbi1zZWN1cmUgZG9tYWluCisgICAgICAgICAgICAgICAgLSB3aXRoIHNlY3VyZSBjYWxsZXIgaW4gdGhlIGNvbmZpZ3VyZWQgc2VjdXJpdHkgZG9tYWluCisgIFxwYXJhbVtpbl0gICBwZXJpcGg6ICAgICAgUGVyaXBoZXJhbCBtYXNrIGZvciBTQUNGRyBhbmQgTlNBQ0ZHIHJlZ2lzdGVycy4KKyAgXHJldHVybiAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGVyaXBoZXJhbCBpcyBjb25maWd1cmVkIGFzIHByaXZpbGVnZSBhY2Nlc3MKKyAgICAgICAgICAgICAgIG9ubHksIGZhbHNlIGZvciBwcml2aWxlZ2UgYW5kIHVucHJpdmlsZWdlIGFjY2VzcyBtb2RlLgorCisgIFNlY3VyZSBvbmx5IGZ1bmN0aW9uczoKKworICBcZm4gICAgICAgICAgaW50MzJfdCBQUENfUE9MQVJJU19Db25maWdTZWN1cml0eSh1aW50MzJfdCBwZXJpcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cikKKyAgXGJyaWVmICAgICAgIENvbmZpZ3VyZXMgc2VjdXJpdHkgbGV2ZWwgZm9yIGEgcGVyaXBoZXJhbCBjb250cm9sbGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgZ2l2ZW4gUFBDIHdpdGggc2VjdXJlIG9yIG5vbi1zZWN1cmUgYWNjZXNzIG9ubHkuCisgIFxwYXJhbVtpbl0gICBwZXJpcGg6ICAgICBQZXJpcGhlcmFsIG1hc2sgZm9yIFNBQ0ZHIGFuZCBOU0FDRkcgcmVnaXN0ZXJzLgorICBccGFyYW1baW5dICAgc2VjX2F0dHI6ICAgU2VjdXJlIGF0dHJpYnV0ZSB2YWx1ZSB0byBzZXQuCisgIFxyZXR1cm4gICAgICBSZXR1cm5zIFBvbGFyaXMgUFBDIGVycm9yIGNvZGUuCisKKyAgXGZuICAgICAgICAgIGJvb2wgUFBDX1BPTEFSSVNfSXNQZXJpcGhTZWN1cmUgKHVpbnQzMl90IHBlcmlwaCkKKyAgXGJyaWVmICAgICAgIENoZWNrcyBpZiB0aGUgcGVyaXBoZXJhbCBpcyBjb25maWd1cmVkIHRvIGJlIHNlY3VyZS4KKyAgXHBhcmFtW2luXSAgIHBlcmlwaDogICAgICBQZXJpcGhlcmFsIG1hc2sgZm9yIFNBQ0ZHICBhbmQgTlNBQ0ZHIHJlZ2lzdGVycy4KKyAgXHJldHVybiAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGVyaXBoZXJhbCBpcyBjb25maWd1cmVkIGFzIHNlY3VyZSwKKyAgICAgICAgICAgICAgIGZhbHNlIGZvciBub24tc2VjdXJlLgorCisgIFxmbiAgICAgICAgICBpbnQzMl90IFBQQ19QT0xBUklTX0VuYWJsZUludGVycnVwdCAodm9pZCkKKyAgXGJyaWVmICAgICAgIEVuYWJsZXMgUFBDIGludGVycnVwdC4KKyAgXHJldHVybiAgICAgIFJldHVybnMgUG9sYXJpcyBQUEMgZXJyb3IgY29kZS4KKworICBcZm4gICAgICAgICAgdm9pZCBQUENfUE9MQVJJU19EaXNhYmxlSW50ZXJydXB0ICh2b2lkKQorICBcYnJpZWYgICAgICAgRGlzYWJsZXMgUFBDIGludGVycnVwdC4KKworICBcZm4gICAgICAgICAgdm9pZCBQUENfUE9MQVJJU19DbGVhckludGVycnVwdCAodm9pZCkKKyAgXGJyaWVmICAgICAgIENsZWFycyBQUEMgaW50ZXJydXB0LgorCisgIFxmbiAgICAgICAgICBib29sIFBQQ19QT0xBUklTX0ludGVycnVwdFN0YXRlICh2b2lkKQorICBcYnJpZWYgICAgICAgR2V0cyBQUEMgaW50ZXJydXB0IHN0YXRlLgorICBccmV0dXJuICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYWN0aXZlLCBmYWxzZSBvdGhlcndpc2UuCisqLworCisvKioKKyAqIFxicmllZiBBY2Nlc3Mgc3RydWN0dXJlIG9mIHRoZSBQUEMgRHJpdmVyLgorICovCit0eXBlZGVmIHN0cnVjdCBfRFJJVkVSX1BQQ19QT0xBUklTIHsKKyAgQVJNX0RSSVZFUl9WRVJTSU9OICAoKkdldFZlcnNpb24pICAgICAgICh2b2lkKTsgICAgICAgICAgICAvLy88IFBvaW50ZXIgdG8gXHJlZiBBUk1fUFBDX0dldFZlcnNpb24gICA6IEdldCBkcml2ZXIgdmVyc2lvbi4KKyAgaW50MzJfdCAgICAgICAgICAgICAoKkluaXRpYWxpemUpICAgICAgICh2b2lkKTsgICAgICAgICAgICAvLy88IFBvaW50ZXIgdG8gXHJlZiBBUk1fUFBDX0luaXRpYWxpemUgICA6IEluaXRpYWxpemUgdGhlIFBQQyBJbnRlcmZhY2UuCisgIGludDMyX3QgICAgICAgICAgICAgKCpVbmluaXRpYWxpemUpICAgICAodm9pZCk7ICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIFxyZWYgQVJNX1BQQ19VbmluaXRpYWxpemUgOiBEZS1pbml0aWFsaXplIHRoZSBQUEMgSW50ZXJmYWNlLgorICBpbnQzMl90ICAgICAgICAgICAgICgqQ29uZmlnUHJpdmlsZWdlKSAgKHVpbnQzMl90IHBlcmlwaCwgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0ciwgUFBDX1BPTEFSSVNfUHJpdkF0dHIgcHJpdl9hdHRyKTsgIC8vLzwgUG9pbnRlciB0byBccmVmIEFSTV9QUENfQ29uZmlnUGVyaXBoIDogQ29uZmlndXJlIGEgcGVyaXBoZXJhbCBjb250cm9sbGVkIGJ5IHRoZSBQUEMuCisgIGJvb2wgICAgICAgICAgICAgICAgKCpJc1BlcmlwaFByaXZPbmx5KSAodWludDMyX3QgcGVyaXBoKTsgIC8vLzwgUG9pbnRlciB0byBccmVmIElzUGVyaXBoUHJpdk9ubHkgOiBDaGVjayBpZiB0aGUgcGVyaXBoZXJhbCBpcyBjb25maWd1cmVkIHRvIGJlIHByaXZpbGVnZSBvbmx5LgorI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICBpbnQzMl90ICAgICAgICAgICAgICgqQ29uZmlnU2VjdXJpdHkpICAgKHVpbnQzMl90IHBlcmlwaCwgUFBDX1BPTEFSSVNfU2VjQXR0ciBzZWNfYXR0cik7ICAvLy88IFBvaW50ZXIgdG8gXHJlZiBBUk1fUFBDX0NvbmZpZ1BlcmlwaCA6IENvbmZpZ3VyZSBhIHBlcmlwaGVyYWwgY29udHJvbGxlZCBieSB0aGUgUFBDLgorICBib29sICAgICAgICAgICAgICAgICgqSXNQZXJpcGhTZWN1cmUpICAgKHVpbnQzMl90IHBlcmlwaCk7ICAvLy88IFBvaW50ZXIgdG8gXHJlZiBJc1BlcmlwaFNlY3VyZSA6ICAgQ2hlY2sgaWYgdGhlIHBlcmlwaGVyYWwgaXMgY29uZmlndXJlZCB0byBiZSBzZWN1cmUuCisgIGludDMyX3QgICAgICAgICAgICAgKCpFbmFibGVJbnRlcnJ1cHQpICAodm9pZCk7ICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIFxyZWYgQVJNX1BQQ19FbmFibGVJbnRlcnJ1cHQgIDogRW5hYmxlIFBQQyBpbnRlcnJ1cHQuCisgIHZvaWQgICAgICAgICAgICAgICAgKCpEaXNhYmxlSW50ZXJydXB0KSAodm9pZCk7ICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIFxyZWYgQVJNX1BQQ19EaXNhYmxlSW50ZXJydXB0IDogRGlzYWJsZSBQUEMgaW50ZXJydXB0LgorICB2b2lkICAgICAgICAgICAgICAgICgqQ2xlYXJJbnRlcnJ1cHQpICAgKHZvaWQpOyAgICAgICAgICAgIC8vLzwgUG9pbnRlciB0byBccmVmIEFSTV9QUENfQ2xlYXJJbnRlcnJ1cHQgICA6IENsZWFyIFBQQyBpbnRlcnJ1cHQuCisgIGJvb2wgICAgICAgICAgICAgICAgKCpJbnRlcnJ1cHRTdGF0ZSkgICAodm9pZCk7ICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIFxyZWYgQVJNX1BQQ19JbnRlcnJ1cHRTdGF0ZSAgIDogUFBDIGludGVycnVwdCBTdGF0ZS4KKyNlbmRpZiAvKiAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9DTVNFKSAmJiAoX19BUk1fRkVBVFVSRV9DTVNFID09IDNVKSkgKi8KK30gY29uc3QgRFJJVkVSX1BQQ19QT0xBUklTOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9fUFBDX1BPTEFSSVNfRFJJVkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX1VTQVJULmMgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9Ecml2ZXJfVVNBUlQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNhMTRhCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvRHJpdmVyX1VTQVJULmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTsgeW91IG1heQorICogbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiRHJpdmVyX1VTQVJULmgiCisKKyNpbmNsdWRlICJjbXNpc19kcml2ZXJfY29uZmlnLmgiCisjaW5jbHVkZSAiUlRFX0RldmljZS5oIgorCisjaWZuZGVmIEFSR19VTlVTRUQKKyNkZWZpbmUgQVJHX1VOVVNFRChhcmcpICAodm9pZClhcmcKKyNlbmRpZgorCisvKiBEcml2ZXIgdmVyc2lvbiAqLworI2RlZmluZSBBUk1fVVNBUlRfRFJWX1ZFUlNJT04gIEFSTV9EUklWRVJfVkVSU0lPTl9NQUpPUl9NSU5PUigyLCAyKQorCisvKiBEcml2ZXIgVmVyc2lvbiAqLworc3RhdGljIGNvbnN0IEFSTV9EUklWRVJfVkVSU0lPTiBEcml2ZXJWZXJzaW9uID0geworICAgIEFSTV9VU0FSVF9BUElfVkVSU0lPTiwKKyAgICBBUk1fVVNBUlRfRFJWX1ZFUlNJT04KK307CisKKy8qIERyaXZlciBDYXBhYmlsaXRpZXMgKi8KK3N0YXRpYyBjb25zdCBBUk1fVVNBUlRfQ0FQQUJJTElUSUVTIERyaXZlckNhcGFiaWxpdGllcyA9IHsKKyAgICAxLCAvKiBzdXBwb3J0cyBVQVJUIChBc3luY2hyb25vdXMpIG1vZGUgKi8KKyAgICAwLCAvKiBzdXBwb3J0cyBTeW5jaHJvbm91cyBNYXN0ZXIgbW9kZSAqLworICAgIDAsIC8qIHN1cHBvcnRzIFN5bmNocm9ub3VzIFNsYXZlIG1vZGUgKi8KKyAgICAwLCAvKiBzdXBwb3J0cyBVQVJUIFNpbmdsZS13aXJlIG1vZGUgKi8KKyAgICAwLCAvKiBzdXBwb3J0cyBVQVJUIElyREEgbW9kZSAqLworICAgIDAsIC8qIHN1cHBvcnRzIFVBUlQgU21hcnQgQ2FyZCBtb2RlICovCisgICAgMCwgLyogU21hcnQgQ2FyZCBDbG9jayBnZW5lcmF0b3IgYXZhaWxhYmxlICovCisgICAgMCwgLyogUlRTIEZsb3cgQ29udHJvbCBhdmFpbGFibGUgKi8KKyAgICAwLCAvKiBDVFMgRmxvdyBDb250cm9sIGF2YWlsYWJsZSAqLworICAgIDAsIC8qIFRyYW5zbWl0IGNvbXBsZXRlZCBldmVudDogXHJlZiBBUk1fVVNBUlR4X0VWRU5UX1RYX0NPTVBMRVRFICovCisgICAgMCwgLyogU2lnbmFsIHJlY2VpdmUgY2hhcmFjdGVyIHRpbWVvdXQgZXZlbnQ6IFxyZWYgQVJNX1VTQVJUeF9FVkVOVF9SWF9USU1FT1VUICovCisgICAgMCwgLyogUlRTIExpbmU6IDA9bm90IGF2YWlsYWJsZSwgMT1hdmFpbGFibGUgKi8KKyAgICAwLCAvKiBDVFMgTGluZTogMD1ub3QgYXZhaWxhYmxlLCAxPWF2YWlsYWJsZSAqLworICAgIDAsIC8qIERUUiBMaW5lOiAwPW5vdCBhdmFpbGFibGUsIDE9YXZhaWxhYmxlICovCisgICAgMCwgLyogRFNSIExpbmU6IDA9bm90IGF2YWlsYWJsZSwgMT1hdmFpbGFibGUgKi8KKyAgICAwLCAvKiBEQ0QgTGluZTogMD1ub3QgYXZhaWxhYmxlLCAxPWF2YWlsYWJsZSAqLworICAgIDAsIC8qIFJJIExpbmU6IDA9bm90IGF2YWlsYWJsZSwgMT1hdmFpbGFibGUgKi8KKyAgICAwLCAvKiBTaWduYWwgQ1RTIGNoYW5nZSBldmVudDogXHJlZiBBUk1fVVNBUlR4X0VWRU5UX0NUUyAqLworICAgIDAsIC8qIFNpZ25hbCBEU1IgY2hhbmdlIGV2ZW50OiBccmVmIEFSTV9VU0FSVHhfRVZFTlRfRFNSICovCisgICAgMCwgLyogU2lnbmFsIERDRCBjaGFuZ2UgZXZlbnQ6IFxyZWYgQVJNX1VTQVJUeF9FVkVOVF9EQ0QgKi8KKyAgICAwLCAvKiBTaWduYWwgUkkgY2hhbmdlIGV2ZW50OiBccmVmIEFSTV9VU0FSVHhfRVZFTlRfUkkgKi8KKyAgICAwICAvKiBSZXNlcnZlZCAqLworfTsKKworc3RhdGljIEFSTV9EUklWRVJfVkVSU0lPTiBBUk1fVVNBUlRfR2V0VmVyc2lvbih2b2lkKQoreworICAgIHJldHVybiBEcml2ZXJWZXJzaW9uOworfQorCitzdGF0aWMgQVJNX1VTQVJUX0NBUEFCSUxJVElFUyBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzKHZvaWQpCit7CisgICAgcmV0dXJuIERyaXZlckNhcGFiaWxpdGllczsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90ICpkZXY7ICAgICAgICAvKiBVQVJUIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICB1aW50MzJfdCB0eF9uYnJfYnl0ZXM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcmVkICovCisgICAgdWludDMyX3QgcnhfbmJyX2J5dGVzOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZXZpZWQgKi8KKyAgICBBUk1fVVNBUlRfU2lnbmFsRXZlbnRfdCBjYl9ldmVudDsgIC8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBldmVudHMgKi8KK30gVUFSVHhfUmVzb3VyY2VzOworCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlR4X0luaXRpYWxpemUoVUFSVHhfUmVzb3VyY2VzICp1YXJ0X2RldikKK3sKKyAgICAvKiBJbml0aWFsaXplcyBnZW5lcmljIFVBUlQgZHJpdmVyICovCisgICAgdWFydF9jbXNka19pbml0KHVhcnRfZGV2LT5kZXYsIFBlcmlwaGVyYWxDbG9jayk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9PSzsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUeF9Qb3dlckNvbnRyb2woVUFSVHhfUmVzb3VyY2VzICp1YXJ0X2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9QT1dFUl9TVEFURSBzdGF0ZSkKK3sKKyAgICBBUkdfVU5VU0VEKHVhcnRfZGV2KTsKKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIEFSTV9QT1dFUl9PRkY6CisgICAgY2FzZSBBUk1fUE9XRVJfTE9XOgorICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBjYXNlIEFSTV9QT1dFUl9GVUxMOgorICAgICAgICAvKiBOb3RoaW5nIHRvIGJlIGRvbmUgKi8KKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7CisgICAgLyogZGVmYXVsdDogIFRoZSBkZWZhdWx0IGlzIG5vdCBkZWZpbmVkIGludGVudGlvbmFsbHkgdG8gZm9yY2UgdGhlCisgICAgICogICAgICAgICAgIGNvbXBpbGVyIHRvIGNoZWNrIHRoYXQgYWxsIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlCisgICAgICogICAgICAgICAgIGNvdmVyZWQgaW4gdGhlIHN3aXRjaC4qLworICAgIH0KK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUeF9TZW5kKFVBUlR4X1Jlc291cmNlcyAqdWFydF9kZXYsIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnBfZGF0YSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgIGlmICgoZGF0YSA9PSBOVUxMKSB8fCAobnVtID09IDBVKSkgeworICAgICAgICAvKiBJbnZhbGlkIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcmV0dXJuIEFSTV9EUklWRVJfRVJST1JfUEFSQU1FVEVSOworICAgIH0KKworICAgIC8qIFJlc2V0cyBwcmV2aW91cyBUWCBjb3VudGVyICovCisgICAgdWFydF9kZXYtPnR4X25icl9ieXRlcyA9IDA7CisKKyAgICB3aGlsZSAodWFydF9kZXYtPnR4X25icl9ieXRlcyAhPSBudW0pIHsKKyAgICAgICAgLyogV2FpdHMgdW50aWwgVUFSVCBpcyByZWFkeSB0byB0cmFuc21pdCAqLworICAgICAgICB3aGlsZSAoIXVhcnRfY21zZGtfdHhfcmVhZHkodWFydF9kZXYtPmRldikpIHsKKyAgICAgICAgfTsKKworICAgICAgICAvKiBBcyBVQVJUIGlzIHJlYWR5IHRvIHRyYW5zbWl0IGF0IHRoaXMgcG9pbnQsIHRoZSB3cml0ZSBmdW5jdGlvbiBjYW4KKyAgICAgICAgICogbm90IHJldHVybiBhbnkgdHJhbnNtaXQgZXJyb3IgKi8KKyAgICAgICAgKHZvaWQpdWFydF9jbXNka193cml0ZSh1YXJ0X2Rldi0+ZGV2LCAqcF9kYXRhKTsKKworICAgICAgICB1YXJ0X2Rldi0+dHhfbmJyX2J5dGVzKys7CisgICAgICAgIHBfZGF0YSsrOworICAgIH0KKworICAgIC8qIFdhaXRzIHVudGlsIGNoYXJhY3RlciBpcyB0cmFuc21pdGVkICovCisgICAgd2hpbGUgKCF1YXJ0X2Ntc2RrX3R4X3JlYWR5KHVhcnRfZGV2LT5kZXYpKSB7CisgICAgfTsKKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlR4X1JlY2VpdmUoVUFSVHhfUmVzb3VyY2VzICp1YXJ0X2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgdWludDhfdCAqcF9kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworCisgICAgaWYgKChkYXRhID09IE5VTEwpIHx8IChudW0gPT0gMFUpKSB7CisgICAgICAgIC8vIEludmFsaWQgcGFyYW1ldGVycworICAgICAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9QQVJBTUVURVI7CisgICAgfQorCisgICAgLyogUmVzZXRzIHByZXZpb3VzIFJYIGNvdW50ZXIgKi8KKyAgICB1YXJ0X2Rldi0+cnhfbmJyX2J5dGVzID0gMDsKKworICAgIHdoaWxlICh1YXJ0X2Rldi0+cnhfbmJyX2J5dGVzICE9IG51bSkgeworICAgICAgICAvKiBXYWl0cyB1bnRpbCBvbmUgY2hhcmFjdGVyIGlzIHJlY2VpdmVkICovCisgICAgICAgIHdoaWxlICghdWFydF9jbXNka19yeF9yZWFkeSh1YXJ0X2Rldi0+ZGV2KSl7fTsKKworICAgICAgICAvKiBBcyBVQVJUIGhhcyByZWNlaXZlZCBvbmUgYnl0ZSwgdGhlIHJlYWQgY2FuIG5vdAorICAgICAgICAgKiByZXR1cm4gYW55IHJlY2VpdmUgZXJyb3IgYXQgdGhpcyBwb2ludCAqLworICAgICAgICAodm9pZCl1YXJ0X2Ntc2RrX3JlYWQodWFydF9kZXYtPmRldiwgcF9kYXRhKTsKKworICAgICAgICB1YXJ0X2Rldi0+cnhfbmJyX2J5dGVzKys7CisgICAgICAgIHBfZGF0YSsrOworICAgIH0KKworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUeF9HZXRUeENvdW50KFVBUlR4X1Jlc291cmNlcyAqdWFydF9kZXYpCit7CisgICAgcmV0dXJuIHVhcnRfZGV2LT50eF9uYnJfYnl0ZXM7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBBUk1fVVNBUlR4X0dldFJ4Q291bnQoVUFSVHhfUmVzb3VyY2VzICp1YXJ0X2RldikKK3sKKyAgICByZXR1cm4gdWFydF9kZXYtPnJ4X25icl9ieXRlczsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUeF9Db250cm9sKFVBUlR4X1Jlc291cmNlcyAqdWFydF9kZXYsIHVpbnQzMl90IGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnKQoreworICAgIHN3aXRjaCAoY29udHJvbCAmIEFSTV9VU0FSVF9DT05UUk9MX01zaykgeworICAgICAgICBjYXNlIEFSTV9VU0FSVF9NT0RFX0FTWU5DSFJPTk9VUzoKKyAgICAgICAgICAgIGlmICh1YXJ0X2Ntc2RrX3NldF9iYXVkcmF0ZSh1YXJ0X2Rldi0+ZGV2LCBhcmcpICE9IFVBUlRfQ01TREtfRVJSX05PTkUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVJNX1VTQVJUX0VSUk9SX0JBVURSQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIFVuc3VwcG9ydGVkIGNvbW1hbmQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIFVBUlQgRGF0YSBiaXRzICovCisgICAgaWYgKGNvbnRyb2wgJiBBUk1fVVNBUlRfREFUQV9CSVRTX01zaykgeworICAgICAgICAvKiBEYXRhIGJpdCBpcyBub3QgY29uZmlndXJhYmxlICovCisgICAgICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIFVBUlQgUGFyaXR5ICovCisgICAgaWYgKGNvbnRyb2wgJiBBUk1fVVNBUlRfUEFSSVRZX01zaykgeworICAgICAgICAvKiBQYXJpdHkgaXMgbm90IGNvbmZpZ3VyYWJsZSAqLworICAgICAgICByZXR1cm4gQVJNX1VTQVJUX0VSUk9SX1BBUklUWTsKKyAgICB9CisKKyAgICAvKiBVU0FSVCBTdG9wIGJpdHMgKi8KKyAgICBpZiAoY29udHJvbCAmIEFSTV9VU0FSVF9TVE9QX0JJVFNfTXNrKSB7CisgICAgICAgIC8qIFN0b3AgYml0IGlzIG5vdCBjb25maWd1cmFibGUgKi8KKyAgICAgICAgcmV0dXJuIEFSTV9VU0FSVF9FUlJPUl9TVE9QX0JJVFM7CisgICAgfQorCisgICAgcmV0dXJuIEFSTV9EUklWRVJfT0s7Cit9CisKKyNpZiAoUlRFX1VTQVJUMCkKKy8qIFVTQVJUMCBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBVQVJUeF9SZXNvdXJjZXMgVVNBUlQwX0RFViA9IHsKKyAgICAuZGV2ID0gJlVBUlQwX0NNU0RLX0RFViwKKyAgICAudHhfbmJyX2J5dGVzID0gMCwKKyAgICAucnhfbmJyX2J5dGVzID0gMCwKKyAgICAuY2JfZXZlbnQgPSBOVUxMLAorfTsKKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMF9Jbml0aWFsaXplKEFSTV9VU0FSVF9TaWduYWxFdmVudF90IGNiX2V2ZW50KQoreworICAgIFVTQVJUMF9ERVYuY2JfZXZlbnQgPSBjYl9ldmVudDsKKworICAgIHJldHVybiBBUk1fVVNBUlR4X0luaXRpYWxpemUoJlVTQVJUMF9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQwX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQwX1Bvd2VyQ29udHJvbChBUk1fUE9XRVJfU1RBVEUgc3RhdGUpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfUG93ZXJDb250cm9sKCZVU0FSVDBfREVWLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9VU0FSVDBfU2VuZChjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfU2VuZCgmVVNBUlQwX0RFViwgZGF0YSwgbnVtKTsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMF9SZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bSkKK3sKKyAgICByZXR1cm4gQVJNX1VTQVJUeF9SZWNlaXZlKCZVU0FSVDBfREVWLCBkYXRhLCBudW0pOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQwX1RyYW5zZmVyKGNvbnN0IHZvaWQgKmRhdGFfb3V0LCB2b2lkICpkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW0pCit7CisgICAgQVJHX1VOVVNFRChkYXRhX291dCk7CisgICAgQVJHX1VOVVNFRChkYXRhX2luKTsKKyAgICBBUkdfVU5VU0VEKG51bSk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIHVpbnQzMl90IEFSTV9VU0FSVDBfR2V0VHhDb3VudCh2b2lkKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0dldFR4Q291bnQoJlVTQVJUMF9ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUMF9HZXRSeENvdW50KHZvaWQpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfR2V0UnhDb3VudCgmVVNBUlQwX0RFVik7Cit9CitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQwX0NvbnRyb2wodWludDMyX3QgY29udHJvbCwgdWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0NvbnRyb2woJlVTQVJUMF9ERVYsIGNvbnRyb2wsIGFyZyk7Cit9CisKK3N0YXRpYyBBUk1fVVNBUlRfU1RBVFVTIEFSTV9VU0FSVDBfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX1NUQVRVUyBzdGF0dXMgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMF9TZXRNb2RlbUNvbnRyb2woQVJNX1VTQVJUX01PREVNX0NPTlRST0wgY29udHJvbCkKK3sKKyAgICBBUkdfVU5VU0VEKGNvbnRyb2wpOworICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBBUk1fVVNBUlQwX0dldE1vZGVtU3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBtb2RlbV9zdGF0dXMgPSB7MCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIG1vZGVtX3N0YXR1czsKK30KKworZXh0ZXJuIEFSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMDsKK0FSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMCA9IHsKKyAgICBBUk1fVVNBUlRfR2V0VmVyc2lvbiwKKyAgICBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzLAorICAgIEFSTV9VU0FSVDBfSW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQwX1VuaW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQwX1Bvd2VyQ29udHJvbCwKKyAgICBBUk1fVVNBUlQwX1NlbmQsCisgICAgQVJNX1VTQVJUMF9SZWNlaXZlLAorICAgIEFSTV9VU0FSVDBfVHJhbnNmZXIsCisgICAgQVJNX1VTQVJUMF9HZXRUeENvdW50LAorICAgIEFSTV9VU0FSVDBfR2V0UnhDb3VudCwKKyAgICBBUk1fVVNBUlQwX0NvbnRyb2wsCisgICAgQVJNX1VTQVJUMF9HZXRTdGF0dXMsCisgICAgQVJNX1VTQVJUMF9TZXRNb2RlbUNvbnRyb2wsCisgICAgQVJNX1VTQVJUMF9HZXRNb2RlbVN0YXR1cworfTsKKyNlbmRpZiAvKiBSVEVfVVNBUlQwICovCisKKyNpZiAoUlRFX1VTQVJUMSkKKy8qIFVTQVJUMSBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBVQVJUeF9SZXNvdXJjZXMgVVNBUlQxX0RFViA9IHsKKyAgICAuZGV2ID0gJlVBUlQxX0NNU0RLX0RFViwKKyAgICAudHhfbmJyX2J5dGVzID0gMCwKKyAgICAucnhfbmJyX2J5dGVzID0gMCwKKyAgICAuY2JfZXZlbnQgPSBOVUxMLAorfTsKKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMV9Jbml0aWFsaXplKEFSTV9VU0FSVF9TaWduYWxFdmVudF90IGNiX2V2ZW50KQoreworICAgIFVTQVJUMV9ERVYuY2JfZXZlbnQgPSBjYl9ldmVudDsKKworICAgIHJldHVybiBBUk1fVVNBUlR4X0luaXRpYWxpemUoJlVTQVJUMV9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQxX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQxX1Bvd2VyQ29udHJvbChBUk1fUE9XRVJfU1RBVEUgc3RhdGUpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfUG93ZXJDb250cm9sKCZVU0FSVDFfREVWLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9VU0FSVDFfU2VuZChjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfU2VuZCgmVVNBUlQxX0RFViwgZGF0YSwgbnVtKTsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMV9SZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bSkKK3sKKyAgICByZXR1cm4gQVJNX1VTQVJUeF9SZWNlaXZlKCZVU0FSVDFfREVWLCBkYXRhLCBudW0pOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQxX1RyYW5zZmVyKGNvbnN0IHZvaWQgKmRhdGFfb3V0LCB2b2lkICpkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW0pCit7CisgICAgQVJHX1VOVVNFRChkYXRhX291dCk7CisgICAgQVJHX1VOVVNFRChkYXRhX2luKTsKKyAgICBBUkdfVU5VU0VEKG51bSk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIHVpbnQzMl90IEFSTV9VU0FSVDFfR2V0VHhDb3VudCh2b2lkKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0dldFR4Q291bnQoJlVTQVJUMV9ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUMV9HZXRSeENvdW50KHZvaWQpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfR2V0UnhDb3VudCgmVVNBUlQxX0RFVik7Cit9CitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQxX0NvbnRyb2wodWludDMyX3QgY29udHJvbCwgdWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0NvbnRyb2woJlVTQVJUMV9ERVYsIGNvbnRyb2wsIGFyZyk7Cit9CisKK3N0YXRpYyBBUk1fVVNBUlRfU1RBVFVTIEFSTV9VU0FSVDFfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX1NUQVRVUyBzdGF0dXMgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMV9TZXRNb2RlbUNvbnRyb2woQVJNX1VTQVJUX01PREVNX0NPTlRST0wgY29udHJvbCkKK3sKKyAgICBBUkdfVU5VU0VEKGNvbnRyb2wpOworICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBBUk1fVVNBUlQxX0dldE1vZGVtU3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBtb2RlbV9zdGF0dXMgPSB7MCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIG1vZGVtX3N0YXR1czsKK30KKworZXh0ZXJuIEFSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMTsKK0FSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMSA9IHsKKyAgICBBUk1fVVNBUlRfR2V0VmVyc2lvbiwKKyAgICBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzLAorICAgIEFSTV9VU0FSVDFfSW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQxX1VuaW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQxX1Bvd2VyQ29udHJvbCwKKyAgICBBUk1fVVNBUlQxX1NlbmQsCisgICAgQVJNX1VTQVJUMV9SZWNlaXZlLAorICAgIEFSTV9VU0FSVDFfVHJhbnNmZXIsCisgICAgQVJNX1VTQVJUMV9HZXRUeENvdW50LAorICAgIEFSTV9VU0FSVDFfR2V0UnhDb3VudCwKKyAgICBBUk1fVVNBUlQxX0NvbnRyb2wsCisgICAgQVJNX1VTQVJUMV9HZXRTdGF0dXMsCisgICAgQVJNX1VTQVJUMV9TZXRNb2RlbUNvbnRyb2wsCisgICAgQVJNX1VTQVJUMV9HZXRNb2RlbVN0YXR1cworfTsKKyNlbmRpZiAvKiBSVEVfVVNBUlQxICovCisKKyNpZiAoUlRFX1VTQVJUMikKKy8qIFVTQVJUMiBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBVQVJUeF9SZXNvdXJjZXMgVVNBUlQyX0RFViA9IHsKKyAgICAuZGV2ID0gJlVBUlQyX0NNU0RLX0RFViwKKyAgICAudHhfbmJyX2J5dGVzID0gMCwKKyAgICAucnhfbmJyX2J5dGVzID0gMCwKKyAgICAuY2JfZXZlbnQgPSBOVUxMLAorfTsKKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMl9Jbml0aWFsaXplKEFSTV9VU0FSVF9TaWduYWxFdmVudF90IGNiX2V2ZW50KQoreworICAgIFVTQVJUMl9ERVYuY2JfZXZlbnQgPSBjYl9ldmVudDsKKworICAgIHJldHVybiBBUk1fVVNBUlR4X0luaXRpYWxpemUoJlVTQVJUMl9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQyX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQyX1Bvd2VyQ29udHJvbChBUk1fUE9XRVJfU1RBVEUgc3RhdGUpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfUG93ZXJDb250cm9sKCZVU0FSVDJfREVWLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9VU0FSVDJfU2VuZChjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfU2VuZCgmVVNBUlQyX0RFViwgZGF0YSwgbnVtKTsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMl9SZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bSkKK3sKKyAgICByZXR1cm4gQVJNX1VTQVJUeF9SZWNlaXZlKCZVU0FSVDJfREVWLCBkYXRhLCBudW0pOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQyX1RyYW5zZmVyKGNvbnN0IHZvaWQgKmRhdGFfb3V0LCB2b2lkICpkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW0pCit7CisgICAgQVJHX1VOVVNFRChkYXRhX291dCk7CisgICAgQVJHX1VOVVNFRChkYXRhX2luKTsKKyAgICBBUkdfVU5VU0VEKG51bSk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIHVpbnQzMl90IEFSTV9VU0FSVDJfR2V0VHhDb3VudCh2b2lkKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0dldFR4Q291bnQoJlVTQVJUMl9ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUMl9HZXRSeENvdW50KHZvaWQpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfR2V0UnhDb3VudCgmVVNBUlQyX0RFVik7Cit9CitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQyX0NvbnRyb2wodWludDMyX3QgY29udHJvbCwgdWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0NvbnRyb2woJlVTQVJUMl9ERVYsIGNvbnRyb2wsIGFyZyk7Cit9CisKK3N0YXRpYyBBUk1fVVNBUlRfU1RBVFVTIEFSTV9VU0FSVDJfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX1NUQVRVUyBzdGF0dXMgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUMl9TZXRNb2RlbUNvbnRyb2woQVJNX1VTQVJUX01PREVNX0NPTlRST0wgY29udHJvbCkKK3sKKyAgICBBUkdfVU5VU0VEKGNvbnRyb2wpOworICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBBUk1fVVNBUlQyX0dldE1vZGVtU3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBtb2RlbV9zdGF0dXMgPSB7MCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIG1vZGVtX3N0YXR1czsKK30KKworZXh0ZXJuIEFSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMjsKK0FSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMiA9IHsKKyAgICBBUk1fVVNBUlRfR2V0VmVyc2lvbiwKKyAgICBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzLAorICAgIEFSTV9VU0FSVDJfSW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQyX1VuaW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQyX1Bvd2VyQ29udHJvbCwKKyAgICBBUk1fVVNBUlQyX1NlbmQsCisgICAgQVJNX1VTQVJUMl9SZWNlaXZlLAorICAgIEFSTV9VU0FSVDJfVHJhbnNmZXIsCisgICAgQVJNX1VTQVJUMl9HZXRUeENvdW50LAorICAgIEFSTV9VU0FSVDJfR2V0UnhDb3VudCwKKyAgICBBUk1fVVNBUlQyX0NvbnRyb2wsCisgICAgQVJNX1VTQVJUMl9HZXRTdGF0dXMsCisgICAgQVJNX1VTQVJUMl9TZXRNb2RlbUNvbnRyb2wsCisgICAgQVJNX1VTQVJUMl9HZXRNb2RlbVN0YXR1cworfTsKKyNlbmRpZiAvKiBSVEVfVVNBUlQyICovCisKKyNpZiAoUlRFX1VTQVJUMykKKy8qIFVTQVJUMyBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBVQVJUeF9SZXNvdXJjZXMgVVNBUlQzX0RFViA9IHsKKyAgICAuZGV2ID0gJlVBUlQzX0NNU0RLX0RFViwKKyAgICAudHhfbmJyX2J5dGVzID0gMCwKKyAgICAucnhfbmJyX2J5dGVzID0gMCwKKyAgICAuY2JfZXZlbnQgPSBOVUxMLAorfTsKKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUM19Jbml0aWFsaXplKEFSTV9VU0FSVF9TaWduYWxFdmVudF90IGNiX2V2ZW50KQoreworICAgIFVTQVJUM19ERVYuY2JfZXZlbnQgPSBjYl9ldmVudDsKKworICAgIHJldHVybiBBUk1fVVNBUlR4X0luaXRpYWxpemUoJlVTQVJUM19ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQzX1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQzX1Bvd2VyQ29udHJvbChBUk1fUE9XRVJfU1RBVEUgc3RhdGUpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfUG93ZXJDb250cm9sKCZVU0FSVDNfREVWLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9VU0FSVDNfU2VuZChjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfU2VuZCgmVVNBUlQzX0RFViwgZGF0YSwgbnVtKTsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUM19SZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bSkKK3sKKyAgICByZXR1cm4gQVJNX1VTQVJUeF9SZWNlaXZlKCZVU0FSVDNfREVWLCBkYXRhLCBudW0pOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQzX1RyYW5zZmVyKGNvbnN0IHZvaWQgKmRhdGFfb3V0LCB2b2lkICpkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW0pCit7CisgICAgQVJHX1VOVVNFRChkYXRhX291dCk7CisgICAgQVJHX1VOVVNFRChkYXRhX2luKTsKKyAgICBBUkdfVU5VU0VEKG51bSk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIHVpbnQzMl90IEFSTV9VU0FSVDNfR2V0VHhDb3VudCh2b2lkKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0dldFR4Q291bnQoJlVTQVJUM19ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUM19HZXRSeENvdW50KHZvaWQpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfR2V0UnhDb3VudCgmVVNBUlQzX0RFVik7Cit9CitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQzX0NvbnRyb2wodWludDMyX3QgY29udHJvbCwgdWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0NvbnRyb2woJlVTQVJUM19ERVYsIGNvbnRyb2wsIGFyZyk7Cit9CisKK3N0YXRpYyBBUk1fVVNBUlRfU1RBVFVTIEFSTV9VU0FSVDNfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX1NUQVRVUyBzdGF0dXMgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUM19TZXRNb2RlbUNvbnRyb2woQVJNX1VTQVJUX01PREVNX0NPTlRST0wgY29udHJvbCkKK3sKKyAgICBBUkdfVU5VU0VEKGNvbnRyb2wpOworICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBBUk1fVVNBUlQzX0dldE1vZGVtU3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBtb2RlbV9zdGF0dXMgPSB7MCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIG1vZGVtX3N0YXR1czsKK30KKworZXh0ZXJuIEFSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMzsKK0FSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUMyA9IHsKKyAgICBBUk1fVVNBUlRfR2V0VmVyc2lvbiwKKyAgICBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzLAorICAgIEFSTV9VU0FSVDNfSW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQzX1VuaW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQzX1Bvd2VyQ29udHJvbCwKKyAgICBBUk1fVVNBUlQzX1NlbmQsCisgICAgQVJNX1VTQVJUM19SZWNlaXZlLAorICAgIEFSTV9VU0FSVDNfVHJhbnNmZXIsCisgICAgQVJNX1VTQVJUM19HZXRUeENvdW50LAorICAgIEFSTV9VU0FSVDNfR2V0UnhDb3VudCwKKyAgICBBUk1fVVNBUlQzX0NvbnRyb2wsCisgICAgQVJNX1VTQVJUM19HZXRTdGF0dXMsCisgICAgQVJNX1VTQVJUM19TZXRNb2RlbUNvbnRyb2wsCisgICAgQVJNX1VTQVJUM19HZXRNb2RlbVN0YXR1cworfTsKKyNlbmRpZiAvKiBSVEVfVVNBUlQzICovCisKKyNpZiAoUlRFX1VTQVJUNCkKKy8qIFVTQVJUNCBEcml2ZXIgd3JhcHBlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBVQVJUeF9SZXNvdXJjZXMgVVNBUlQ0X0RFViA9IHsKKyAgICAuZGV2ID0gJlVBUlQ0X0NNU0RLX0RFViwKKyAgICAudHhfbmJyX2J5dGVzID0gMCwKKyAgICAucnhfbmJyX2J5dGVzID0gMCwKKyAgICAuY2JfZXZlbnQgPSBOVUxMLAorfTsKKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUNF9Jbml0aWFsaXplKEFSTV9VU0FSVF9TaWduYWxFdmVudF90IGNiX2V2ZW50KQoreworICAgIFVTQVJUNF9ERVYuY2JfZXZlbnQgPSBjYl9ldmVudDsKKworICAgIHJldHVybiBBUk1fVVNBUlR4X0luaXRpYWxpemUoJlVTQVJUNF9ERVYpOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQ0X1VuaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIHJldHVybiBBUk1fRFJJVkVSX09LOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQ0X1Bvd2VyQ29udHJvbChBUk1fUE9XRVJfU1RBVEUgc3RhdGUpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfUG93ZXJDb250cm9sKCZVU0FSVDRfREVWLCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEFSTV9VU0FSVDRfU2VuZChjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBudW0pCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfU2VuZCgmVVNBUlQ0X0RFViwgZGF0YSwgbnVtKTsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUNF9SZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQzMl90IG51bSkKK3sKKyAgICByZXR1cm4gQVJNX1VTQVJUeF9SZWNlaXZlKCZVU0FSVDRfREVWLCBkYXRhLCBudW0pOworfQorCitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQ0X1RyYW5zZmVyKGNvbnN0IHZvaWQgKmRhdGFfb3V0LCB2b2lkICpkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW0pCit7CisgICAgQVJHX1VOVVNFRChkYXRhX291dCk7CisgICAgQVJHX1VOVVNFRChkYXRhX2luKTsKKyAgICBBUkdfVU5VU0VEKG51bSk7CisKKyAgICByZXR1cm4gQVJNX0RSSVZFUl9FUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIHVpbnQzMl90IEFSTV9VU0FSVDRfR2V0VHhDb3VudCh2b2lkKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0dldFR4Q291bnQoJlVTQVJUNF9ERVYpOworfQorCitzdGF0aWMgdWludDMyX3QgQVJNX1VTQVJUNF9HZXRSeENvdW50KHZvaWQpCit7CisgICAgcmV0dXJuIEFSTV9VU0FSVHhfR2V0UnhDb3VudCgmVVNBUlQ0X0RFVik7Cit9CitzdGF0aWMgaW50MzJfdCBBUk1fVVNBUlQ0X0NvbnRyb2wodWludDMyX3QgY29udHJvbCwgdWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBBUk1fVVNBUlR4X0NvbnRyb2woJlVTQVJUNF9ERVYsIGNvbnRyb2wsIGFyZyk7Cit9CisKK3N0YXRpYyBBUk1fVVNBUlRfU1RBVFVTIEFSTV9VU0FSVDRfR2V0U3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX1NUQVRVUyBzdGF0dXMgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludDMyX3QgQVJNX1VTQVJUNF9TZXRNb2RlbUNvbnRyb2woQVJNX1VTQVJUX01PREVNX0NPTlRST0wgY29udHJvbCkKK3sKKyAgICBBUkdfVU5VU0VEKGNvbnRyb2wpOworICAgIHJldHVybiBBUk1fRFJJVkVSX0VSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBBUk1fVVNBUlQ0X0dldE1vZGVtU3RhdHVzKHZvaWQpCit7CisgICAgQVJNX1VTQVJUX01PREVNX1NUQVRVUyBtb2RlbV9zdGF0dXMgPSB7MCwgMCwgMCwgMCwgMH07CisgICAgcmV0dXJuIG1vZGVtX3N0YXR1czsKK30KKworZXh0ZXJuIEFSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUNDsKK0FSTV9EUklWRVJfVVNBUlQgRHJpdmVyX1VTQVJUNCA9IHsKKyAgICBBUk1fVVNBUlRfR2V0VmVyc2lvbiwKKyAgICBBUk1fVVNBUlRfR2V0Q2FwYWJpbGl0aWVzLAorICAgIEFSTV9VU0FSVDRfSW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQ0X1VuaW5pdGlhbGl6ZSwKKyAgICBBUk1fVVNBUlQ0X1Bvd2VyQ29udHJvbCwKKyAgICBBUk1fVVNBUlQ0X1NlbmQsCisgICAgQVJNX1VTQVJUNF9SZWNlaXZlLAorICAgIEFSTV9VU0FSVDRfVHJhbnNmZXIsCisgICAgQVJNX1VTQVJUNF9HZXRUeENvdW50LAorICAgIEFSTV9VU0FSVDRfR2V0UnhDb3VudCwKKyAgICBBUk1fVVNBUlQ0X0NvbnRyb2wsCisgICAgQVJNX1VTQVJUNF9HZXRTdGF0dXMsCisgICAgQVJNX1VTQVJUNF9TZXRNb2RlbUNvbnRyb2wsCisgICAgQVJNX1VTQVJUNF9HZXRNb2RlbVN0YXR1cworfTsKKyNlbmRpZiAvKiBSVEVfVVNBUlQ0ICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9jb25maWcvUlRFX0RldmljZS5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvY29uZmlnL1JURV9EZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFjMGNjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2Ntc2lzX2RyaXZlcnMvY29uZmlnL1JURV9EZXZpY2UuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8tLS0tLS0tLSA8PDwgVXNlIENvbmZpZ3VyYXRpb24gV2l6YXJkIGluIENvbnRleHQgTWVudSA+Pj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBfX1JURV9ERVZJQ0VfSAorI2RlZmluZSBfX1JURV9ERVZJQ0VfSAorCisvLyA8cT4gVVNBUlQgKFVuaXZlcnNhbCBzeW5jaHJvbm91cyAtIGFzeW5jaHJvbm91cyByZWNlaXZlciB0cmFuc21pdHRlcikgW0RyaXZlcl9VU0FSVDBdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1VTQVJUMCBpbiBjb21wb25lbnQgOjpEcml2ZXJzOlVTQVJUCisjZGVmaW5lICAgUlRFX1VTQVJUMCAgICAgICAgICAgICAgICAgICAgIDEKKworLy8gPHE+IFVTQVJUIChVbml2ZXJzYWwgc3luY2hyb25vdXMgLSBhc3luY2hyb25vdXMgcmVjZWl2ZXIgdHJhbnNtaXR0ZXIpIFtEcml2ZXJfVVNBUlQxXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9VU0FSVDEgaW4gY29tcG9uZW50IDo6RHJpdmVyczpVU0FSVAorI2RlZmluZSAgIFJURV9VU0FSVDEgICAgICAgICAgICAgICAgICAgICAwCisKKy8vIDxxPiBNUEMgKE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtEcml2ZXJfSVNSQU0wX01QQ10KKy8vIDxpPiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBEcml2ZXJfSVNSQU0wX01QQyBpbiBjb21wb25lbnQgOjpEcml2ZXJzOk1QQworI2RlZmluZSAgIFJURV9JU1JBTTBfTVBDICAgICAgICAgICAgICAgICAxCisKKy8vIDxxPiBNUEMgKE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtEcml2ZXJfSVNSQU0xX01QQ10KKy8vIDxpPiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBEcml2ZXJfSVNSQU0xX01QQyBpbiBjb21wb25lbnQgOjpEcml2ZXJzOk1QQworI2RlZmluZSAgIFJURV9JU1JBTTFfTVBDICAgICAgICAgICAgICAgICAxCisKKy8vIDxxPiBNUEMgKE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtEcml2ZXJfU1JBTV9NUENdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1NSQU1fTVBDIGluIGNvbXBvbmVudCA6OkRyaXZlcnM6TVBDCisjZGVmaW5lICAgUlRFX1NSQU1fTVBDICAgICAgICAgICAgICAgICAgIDEKKworLy8gPHE+IE1QQyAoTWVtb3J5IFByb3RlY3Rpb24gQ29udHJvbGxlcikgW0RyaXZlcl9RU1BJX01QQ10KKy8vIDxpPiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBEcml2ZXJfUVNQSV9NUEMgaW4gY29tcG9uZW50IDo6RHJpdmVyczpNUEMKKyNkZWZpbmUgICBSVEVfUVNQSV9NUEMgICAgICAgICAgICAgICAgICAgMQorCisvLyA8cT4gUFBDIChQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcikgW1BQQ19QT0xBUklTX01BSU4wXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9QUENfUE9MQVJJU19NQUlOMCBpbiBjb21wb25lbnQgOjpEcml2ZXJzOlBQQworI2RlZmluZSAgIFJURV9QUENfUE9MQVJJU19NQUlOMCAgICAgICAgICAgICAxCisKKy8vIDxxPiBQUEMgKFBlcmlwaGVyYWwgUHJvdGVjdGlvbiBDb250cm9sbGVyKSBbUFBDX1BPTEFSSVNfTUFJTl9FWFAwXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDAgaW4gY29tcG9uZW50IDo6RHJpdmVyczpQUEMKKyNkZWZpbmUgICBSVEVfUFBDX1BPTEFSSVNfTUFJTl9FWFAwICAgICAgICAgICAgIDEKKworLy8gPHE+IFBQQyAoUGVyaXBoZXJhbCBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtQUENfUE9MQVJJU19NQUlOX0VYUDFdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMSBpbiBjb21wb25lbnQgOjpEcml2ZXJzOlBQQworI2RlZmluZSAgIFJURV9QUENfUE9MQVJJU19NQUlOX0VYUDEgICAgICAgICAgICAgMQorCisvLyA8cT4gUFBDIChQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcikgW1BQQ19QT0xBUklTX01BSU5fRVhQMl0KKy8vIDxpPiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAyIGluIGNvbXBvbmVudCA6OkRyaXZlcnM6UFBDCisjZGVmaW5lICAgUlRFX1BQQ19QT0xBUklTX01BSU5fRVhQMiAgICAgICAgICAgICAxCisKKy8vIDxxPiBQUEMgKFBlcmlwaGVyYWwgUHJvdGVjdGlvbiBDb250cm9sbGVyKSBbUFBDX1BPTEFSSVNfTUFJTl9FWFAzXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDMgaW4gY29tcG9uZW50IDo6RHJpdmVyczpQUEMKKyNkZWZpbmUgICBSVEVfUFBDX1BPTEFSSVNfTUFJTl9FWFAzICAgICAgICAgICAgIDEKKworLy8gPHE+IFBQQyAoUGVyaXBoZXJhbCBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtQUENfUE9MQVJJU19QRVJJUEgwXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEgwIGluIGNvbXBvbmVudCA6OkRyaXZlcnM6UFBDCisjZGVmaW5lICAgUlRFX1BQQ19QT0xBUklTX1BFUklQSDAgICAgICAgICAgICAgMQorCisvLyA8cT4gUFBDIChQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcikgW1BQQ19QT0xBUklTX1BFUklQSDFdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSDEgaW4gY29tcG9uZW50IDo6RHJpdmVyczpQUEMKKyNkZWZpbmUgICBSVEVfUFBDX1BPTEFSSVNfUEVSSVBIMSAgICAgICAgICAgICAxCisKKy8vIDxxPiBQUEMgKFBlcmlwaGVyYWwgUHJvdGVjdGlvbiBDb250cm9sbGVyKSBbUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAwIGluIGNvbXBvbmVudCA6OkRyaXZlcnM6UFBDCisjZGVmaW5lICAgUlRFX1BQQ19QT0xBUklTX1BFUklQSF9FWFAwICAgICAgICAgICAgIDEKKworLy8gPHE+IFBQQyAoUGVyaXBoZXJhbCBQcm90ZWN0aW9uIENvbnRyb2xsZXIpIFtQUENfUE9MQVJJU19QRVJJUEhfRVhQMV0KKy8vIDxpPiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDEgaW4gY29tcG9uZW50IDo6RHJpdmVyczpQUEMKKyNkZWZpbmUgICBSVEVfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDEgICAgICAgICAgICAgMQorCisvLyA8cT4gUFBDIChQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcikgW1BQQ19QT0xBUklTX1BFUklQSF9FWFAyXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMiBpbiBjb21wb25lbnQgOjpEcml2ZXJzOlBQQworI2RlZmluZSAgIFJURV9QUENfUE9MQVJJU19QRVJJUEhfRVhQMiAgICAgICAgICAgICAxCisKKy8vIDxxPiBQUEMgKFBlcmlwaGVyYWwgUHJvdGVjdGlvbiBDb250cm9sbGVyKSBbUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNdCisvLyA8aT4gQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAzIGluIGNvbXBvbmVudCA6OkRyaXZlcnM6UFBDCisjZGVmaW5lICAgUlRFX1BQQ19QT0xBUklTX1BFUklQSF9FWFAzICAgICAgICAgICAgIDEKKworLy8gPHE+IEZsYXNoIGRldmljZSBlbXVsYXRlZCBieSBTUkFNIFtEcml2ZXJfRmxhc2gwXQorLy8gPGk+IENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIERyaXZlcl9GbGFzaDAgaW4gY29tcG9uZW50IDo6RHJpdmVyczpGbGFzaAorI2RlZmluZSAgIFJURV9GTEFTSDAgICAgICAgICAgICAgICAgICAgICAxCisKKyNlbmRpZiAgLyogX19SVEVfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9jbXNpc19kcml2ZXJzL2NvbmZpZy9jbXNpc19kcml2ZXJfY29uZmlnLmggYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9jb25maWcvY21zaXNfZHJpdmVyX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWRiODkKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvY21zaXNfZHJpdmVycy9jb25maWcvY21zaXNfZHJpdmVyX2NvbmZpZy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQ01TSVNfRFJJVkVSX0NPTkZJR19IX18KKyNkZWZpbmUgX19DTVNJU19EUklWRVJfQ09ORklHX0hfXworCisjaW5jbHVkZSAiY21zaXMuaCIKKyNpbmNsdWRlICJkZXZpY2VfZGVmaW5pdGlvbi5oIgorI2luY2x1ZGUgIlJURV9EZXZpY2UuaCIKKworI2RlZmluZSBVQVJUMF9DTVNES19ERVYgICAgIFVBUlQwX0NNU0RLX0RFVl9OUworCisjZGVmaW5lIE1QQ19JU1JBTTBfREVWICAgICAgTVBDX0lTUkFNMF9ERVZfUworI2RlZmluZSBNUENfSVNSQU0xX0RFViAgICAgIE1QQ19JU1JBTTFfREVWX1MKKyNkZWZpbmUgTVBDX1NSQU1fREVWICAgICAgICBNUENfU1JBTV9ERVZfUworI2RlZmluZSBNUENfUVNQSV9ERVYgICAgICAgIE1QQ19RU1BJX0RFVl9TCisKKyNkZWZpbmUgUFBDX1BPTEFSSVNfTUFJTjBfREVWICAgICAgICAgICAgUFBDX1BPTEFSSVNfTUFJTjBfREVWX1MKKyNkZWZpbmUgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0RFViAgICAgICAgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0RFVl9TCisjZGVmaW5lIFBQQ19QT0xBUklTX01BSU5fRVhQMV9ERVYgICAgICAgIFBQQ19QT0xBUklTX01BSU5fRVhQMV9ERVZfUworI2RlZmluZSBQUENfUE9MQVJJU19NQUlOX0VYUDJfREVWICAgICAgICBQUENfUE9MQVJJU19NQUlOX0VYUDJfREVWX1MKKyNkZWZpbmUgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0RFViAgICAgICAgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0RFVl9TCisjZGVmaW5lIFBQQ19QT0xBUklTX1BFUklQSDBfREVWICAgICAgICAgIFBQQ19QT0xBUklTX1BFUklQSDBfREVWX1MKKyNkZWZpbmUgUFBDX1BPTEFSSVNfUEVSSVBIMV9ERVYgICAgICAgICAgUFBDX1BPTEFSSVNfUEVSSVBIMV9ERVZfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9ERVYgICAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9ERVZfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9ERVYgICAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9ERVZfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9ERVYgICAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9ERVZfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19ERVYgICAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19ERVZfUworCisjZW5kaWYgIC8qIF9fQ01TSVNfRFJJVkVSX0NPTkZJR19IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvY29uZmlnL2RldmljZV9jZmcuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvY29uZmlnL2RldmljZV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRmMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9jb25maWcvZGV2aWNlX2NmZy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19ERVZJQ0VfQ0ZHX0hfXworI2RlZmluZSBfX0RFVklDRV9DRkdfSF9fCisKKy8qKgorICogXGZpbGUgZGV2aWNlX2NmZy5oCisgKiBcYnJpZWYKKyAqIFRoaXMgaXMgdGhlIGRldmljZSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCBvbmx5IHVzZWQgcGVyaXBoZXJhbHMKKyAqIGRlZmluZWQgYW5kIGNvbmZpZ3VyZWQgdmlhIHRoZSBzZWN1cmUgYW5kL29yIG5vbi1zZWN1cmUgYmFzZSBhZGRyZXNzLgorICovCisKKy8qIEFSTSBNZW1vcnkgUHJvdGVjdGlvbiBDb250cm9sbGVyIChNUEMpICovCisjZGVmaW5lIE1QQ19JU1JBTTBfUworI2RlZmluZSBNUENfSVNSQU0xX1MKKyNkZWZpbmUgTVBDX1NSQU1fUworI2RlZmluZSBNUENfUVNQSV9TCisKKy8qIEFSTSBQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcnMgKFBQQykgKi8KKyNkZWZpbmUgUFBDX1BPTEFSSVNfTUFJTjBfUworI2RlZmluZSBQUENfUE9MQVJJU19NQUlOX0VYUDBfUworI2RlZmluZSBQUENfUE9MQVJJU19NQUlOX0VYUDFfUworI2RlZmluZSBQUENfUE9MQVJJU19NQUlOX0VYUDJfUworI2RlZmluZSBQUENfUE9MQVJJU19NQUlOX0VYUDNfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEgwX1MKKyNkZWZpbmUgUFBDX1BPTEFSSVNfUEVSSVBIMV9TCisjZGVmaW5lIFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX1MKKyNkZWZpbmUgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfUworI2RlZmluZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9TCisjZGVmaW5lIFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX1MKKworLyogQVJNIFVBUlQgQ01TREsgKi8KKyNkZWZpbmUgREVGQVVMVF9VQVJUX0JBVURSQVRFICAxMTUyMDAKKyNkZWZpbmUgVUFSVDBfQ01TREtfTlMKKworLyoqIFN5c3RlbSBDb3VudGVyIEFybXY4LU0gKi8KKyNkZWZpbmUgU1lTQ09VTlRFUl9DTlRSTF9BUk1WOF9NX1MKKyNkZWZpbmUgU1lTQ09VTlRFUl9DTlRSTF9BUk1WOF9NX0RFViAgICBTWVNDT1VOVEVSX0NOVFJMX0FSTVY4X01fREVWX1MKKworLyoqCisgKiBBcmJpdHJhcnkgc2NhbGluZyB2YWx1ZXMgZm9yIHRlc3QgcHVycG9zZXMKKyAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTBfSU5UICAgICAgICAgICAxdQorI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTBfRlJBQ1QgICAgICAgICAwdQorI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTFfSU5UICAgICAgICAgICAxdQorI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTFfRlJBQ1QgICAgICAgICAwdQorCisKKy8qIFN5c3RlbSBUaW1lciBBcm12OC1NICovCisjZGVmaW5lIFNZU1RJTUVSMF9BUk1WOF9NX1MKKworI2RlZmluZSBTWVNUSU1FUjBfQVJNVjhNX0RFRkFVTFRfRlJFUV9IWiAgICAoMzIwMDAwMDB1bCkKKworI2VuZGlmICAvKiBfX0RFVklDRV9DRkdfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvY21zaXMuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9jbXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MTIzOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvY21zaXMuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgQXJtIExpbWl0ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19DTVNJU19IX18KKyNkZWZpbmUgX19DTVNJU19IX18KKworI2luY2x1ZGUgImNvcnN0b25lX3BvbGFyaXMuaCIKKworI2VuZGlmICAvKiBfX0NNU0lTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL2NvcnN0b25lX3BvbGFyaXMuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9jb3JzdG9uZV9wb2xhcmlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3OGU4MwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9jb3JzdG9uZV9wb2xhcmlzLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19DT1JTVE9ORV9QT0xBUklTX0hfXworI2RlZmluZSBfX0NPUlNUT05FX1BPTEFSSVNfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PSAgU3RhcnQgb2Ygc2VjdGlvbiB1c2luZyBhbm9ueW1vdXMgdW5pb25zICA9PT09PT09PT09PT09PSAqLworI2lmICAgZGVmaW5lZCAoX19DQ19BUk0pCisgICNwcmFnbWEgcHVzaAorICAjcHJhZ21hIGFub25fdW5pb25zCisjZWxpZiBkZWZpbmVkIChfX0lDQ0FSTV9fKQorICAjcHJhZ21hIGxhbmd1YWdlPWV4dGVuZGVkCisjZWxpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKQorICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjMTEtZXh0ZW5zaW9ucyIKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcmVzZXJ2ZWQtaWQtbWFjcm8iCisjZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKKyAgLyogYW5vbnltb3VzIHVuaW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0ICovCisjZWxpZiBkZWZpbmVkIChfX1RNUzQ3MF9fKQorICAvKiBhbm9ueW1vdXMgdW5pb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKyNlbGlmIGRlZmluZWQgKF9fVEFTS0lOR19fKQorICAjcHJhZ21hIHdhcm5pbmcgNTg2CisjZWxpZiBkZWZpbmVkIChfX0NTTUNfXykKKyAgLyogYW5vbnltb3VzIHVuaW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0ICovCisjZWxzZQorICAjd2FybmluZyBOb3Qgc3VwcG9ydGVkIGNvbXBpbGVyIHR5cGUKKyNlbmRpZgorCisKKy8qID09PT09PT09ICBDb25maWd1cmF0aW9uIG9mIENvcmUgUGVyaXBoZXJhbHMgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNkZWZpbmUgX19TQVVSRUdJT05fUFJFU0VOVCAgICAgICAxVSAgICAgICAgLyogU0FVIHJlZ2lvbnMgcHJlc2VudCAqLworI2RlZmluZSBfX01QVV9QUkVTRU5UICAgICAgICAgICAgIDFVICAgICAgICAvKiBNUFUgcHJlc2VudCAqLworI2RlZmluZSBfX1ZUT1JfUFJFU0VOVCAgICAgICAgICAgIDFVICAgICAgICAvKiBWVE9SIHByZXNlbnQgKi8KKyNkZWZpbmUgX19OVklDX1BSSU9fQklUUyAgICAgICAgICAzVSAgICAgICAgLyogTnVtYmVyIG9mIEJpdHMgdXNlZCBmb3IgUHJpb3JpdHkgTGV2ZWxzICovCisjZGVmaW5lIF9fVmVuZG9yX1N5c1RpY2tDb25maWcgICAgMFUgICAgICAgIC8qIFNldCB0byAxIGlmIGRpZmZlcmVudCBTeXNUaWNrIENvbmZpZyBpcyB1c2VkICovCisjZGVmaW5lIF9fRlBVX1BSRVNFTlQgICAgICAgICAgICAgMVUgICAgICAgIC8qIEZQVSBwcmVzZW50ICovCisjZGVmaW5lIF9fRlBVX0RQICAgICAgICAgICAgICAgICAgMVUgICAgICAgIC8qIGRvdWJsZSBwcmVjaXNpb24gRlBVICovCisjZGVmaW5lIF9fRFNQX1BSRVNFTlQgICAgICAgICAgICAgMVUgICAgICAgIC8qIERTUCBleHRlbnNpb24gcHJlc2VudCAqLworI2RlZmluZSBfX1BNVV9QUkVTRU5UICAgICAgICAgICAgIDFVICAgICAgICAvKiBQTVUgcHJlc2VudCAqLworI2RlZmluZSBfX1BNVV9OVU1fRVZFTlRDTlQgICAgICAgIDhVICAgICAgICAvKiBOdW1iZXIgb2YgUE1VIGV2ZW50IGNvdW50ZXJzICovCisjZGVmaW5lIF9fSUNBQ0hFX1BSRVNFTlQgICAgICAgICAgMVUgICAgICAgIC8qIEluc3RydWN0aW9uIENhY2hlIHByZXNlbnQgKi8KKyNkZWZpbmUgX19EQ0FDSEVfUFJFU0VOVCAgICAgICAgICAxVSAgICAgICAgLyogRGF0YSBDYWNoZSBwcmVzZW50ICovCisKKyNpbmNsdWRlICJwbGF0Zm9ybV9pcnEuaCIKKyNpbmNsdWRlICJjb3JlX2FybXY4MW1tbC5oIiAgICAgICAgICAgICAgICAgLyogQXJjaGl0ZWN0dXJlIGFuZCBjb3JlIHBlcmlwaGVyYWxzICovCisjaW5jbHVkZSAicGxhdGZvcm1fYmFzZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAicGxhdGZvcm1fcmVncy5oIgorI2luY2x1ZGUgInBsYXRmb3JtX3BpbnMuaCIKKyNpbmNsdWRlICJzeXN0ZW1fY29yZV9pbml0LmgiCisKKy8qID09PT09PT09PT09PT09PT09PT09PSAgRW5kIG9mIHNlY3Rpb24gdXNpbmcgYW5vbnltb3VzIHVuaW9ucyAgPT09PT09PT09PT09PT09PSAqLworI2lmICAgZGVmaW5lZCAoX19DQ19BUk0pCisgICNwcmFnbWEgcG9wCisjZWxpZiBkZWZpbmVkIChfX0lDQ0FSTV9fKQorICAvKiBsZWF2ZSBhbm9ueW1vdXMgdW5pb25zIGVuYWJsZWQgKi8KKyNlbGlmIChfX0FSTUNDX1ZFUlNJT04gPj0gNjAxMDA1MCkKKyAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VsaWYgZGVmaW5lZCAoX19HTlVDX18pCisgIC8qIGFub255bW91cyB1bmlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCAqLworI2VsaWYgZGVmaW5lZCAoX19UTVM0NzBfXykKKyAgLyogYW5vbnltb3VzIHVuaW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0ICovCisjZWxpZiBkZWZpbmVkIChfX1RBU0tJTkdfXykKKyAgI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUKKyNlbGlmIGRlZmluZWQgKF9fQ1NNQ19fKQorICAvKiBhbm9ueW1vdXMgdW5pb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKyNlbHNlCisgICN3YXJuaW5nIE5vdCBzdXBwb3J0ZWQgY29tcGlsZXIgdHlwZQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0NPUlNUT05FX1BPTEFSSVNfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvZGV2aWNlX2RlZmluaXRpb24uaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9kZXZpY2VfZGVmaW5pdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzFiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvZGV2aWNlX2RlZmluaXRpb24uaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBkZXZpY2VfZGVmaW5pdGlvbi5oCisgKiBcYnJpZWYgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIGV4cG9ydGVkIGJhc2VkIG9uIHRoZQorICogcGVyaXBoZXJhbCBkZWZpbml0aW9ucyBmcm9tIGRldmljZV9jZmcuaC4KKyAqIFRoaXMgZmlsZSBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgaGVscGVyIGZvciBiYXJlbWV0YWwKKyAqIGFwcGxpY2F0aW9ucyBhbmQvb3IgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gY29uZmlndXJlIHRoZSBnZW5lcmljCisgKiBkcml2ZXIgc3RydWN0dXJlcy4KKyAqLworCisjaWZuZGVmIF9fREVWSUNFX0RFRklOSVRJT05fSF9fCisjZGVmaW5lIF9fREVWSUNFX0RFRklOSVRJT05fSF9fCisKKyNpbmNsdWRlICJkZXZpY2VfY2ZnLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogPT09PT09PSBEZWZpbmVzIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzID09PT09PT0gKi8KKy8qIFVBUlQgQ01TREsgZHJpdmVyIHN0cnVjdHVyZXMgKi8KKyNpZmRlZiBVQVJUMF9DTVNES19TCisjaW5jbHVkZSAidWFydF9jbXNka19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUMF9DTVNES19ERVZfUzsKKyNlbmRpZgorI2lmZGVmIFVBUlQwX0NNU0RLX05TCisjaW5jbHVkZSAidWFydF9jbXNka19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUMF9DTVNES19ERVZfTlM7CisjZW5kaWYKKworI2lmZGVmIFVBUlQxX0NNU0RLX1MKKyNpbmNsdWRlICJ1YXJ0X2Ntc2RrX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQxX0NNU0RLX0RFVl9TOworI2VuZGlmCisjaWZkZWYgVUFSVDFfQ01TREtfTlMKKyNpbmNsdWRlICJ1YXJ0X2Ntc2RrX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQxX0NNU0RLX0RFVl9OUzsKKyNlbmRpZgorCisjaWZkZWYgVUFSVDJfQ01TREtfUworI2luY2x1ZGUgInVhcnRfY21zZGtfZHJ2LmgiCitleHRlcm4gc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDJfQ01TREtfREVWX1M7CisjZW5kaWYKKyNpZmRlZiBVQVJUMl9DTVNES19OUworI2luY2x1ZGUgInVhcnRfY21zZGtfZHJ2LmgiCitleHRlcm4gc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDJfQ01TREtfREVWX05TOworI2VuZGlmCisKKyNpZmRlZiBVQVJUM19DTVNES19TCisjaW5jbHVkZSAidWFydF9jbXNka19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUM19DTVNES19ERVZfUzsKKyNlbmRpZgorI2lmZGVmIFVBUlQzX0NNU0RLX05TCisjaW5jbHVkZSAidWFydF9jbXNka19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUM19DTVNES19ERVZfTlM7CisjZW5kaWYKKworI2lmZGVmIFVBUlQ0X0NNU0RLX1MKKyNpbmNsdWRlICJ1YXJ0X2Ntc2RrX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQ0X0NNU0RLX0RFVl9TOworI2VuZGlmCisjaWZkZWYgVUFSVDRfQ01TREtfTlMKKyNpbmNsdWRlICJ1YXJ0X2Ntc2RrX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQ0X0NNU0RLX0RFVl9OUzsKKyNlbmRpZgorCisjaWZkZWYgVUFSVDVfQ01TREtfUworI2luY2x1ZGUgInVhcnRfY21zZGtfZHJ2LmgiCitleHRlcm4gc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDVfQ01TREtfREVWX1M7CisjZW5kaWYKKyNpZmRlZiBVQVJUNV9DTVNES19OUworI2luY2x1ZGUgInVhcnRfY21zZGtfZHJ2LmgiCitleHRlcm4gc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDVfQ01TREtfREVWX05TOworI2VuZGlmCisKKy8qIEFSTSBQUEMgZHJpdmVyIHN0cnVjdHVyZXMgKi8KKyNpZmRlZiBQUENfUE9MQVJJU19NQUlOMF9TCisjaW5jbHVkZSAicHBjX3BvbGFyaXNfZHJ2LmgiCitleHRlcm4gc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX01BSU4wX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBQUENfUE9MQVJJU19NQUlOX0VYUDBfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19NQUlOX0VYUDBfREVWX1M7CisjZW5kaWYKKworI2lmZGVmIFBQQ19QT0xBUklTX01BSU5fRVhQMV9TCisjaW5jbHVkZSAicHBjX3BvbGFyaXNfZHJ2LmgiCitleHRlcm4gc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX01BSU5fRVhQMV9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX1MKKyNpbmNsdWRlICJwcGNfcG9sYXJpc19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBQUENfUE9MQVJJU19NQUlOX0VYUDNfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19NQUlOX0VYUDNfREVWX1M7CisjZW5kaWYKKworI2lmZGVmIFBQQ19QT0xBUklTX1BFUklQSDBfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEgwX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBQUENfUE9MQVJJU19QRVJJUEgxX1MKKyNpbmNsdWRlICJwcGNfcG9sYXJpc19kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfUEVSSVBIMV9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfUworI2luY2x1ZGUgInBwY19wb2xhcmlzX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQM19ERVZfUzsKKyNlbmRpZgorCisvKiBTeXN0ZW0gY291bnRlcnMgKi8KKyNpZmRlZiBTWVNDT1VOVEVSX0NOVFJMX0FSTVY4X01fUworI2luY2x1ZGUgInN5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuaCIKK2V4dGVybiBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90IFNZU0NPVU5URVJfQ05UUkxfQVJNVjhfTV9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgU1lTQ09VTlRFUl9SRUFEX0FSTVY4X01fUworI2luY2x1ZGUgInN5c2NvdW50ZXJfYXJtdjgtbV9yZWFkX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fcmVhZF9kZXZfdCBTWVNDT1VOVEVSX1JFQURfQVJNVjhfTV9ERVZfUzsKKyNlbmRpZgorI2lmZGVmIFNZU0NPVU5URVJfUkVBRF9BUk1WOF9NX05TCisjaW5jbHVkZSAic3lzY291bnRlcl9hcm12OC1tX3JlYWRfZHJ2LmgiCitleHRlcm4gc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9yZWFkX2Rldl90IFNZU0NPVU5URVJfUkVBRF9BUk1WOF9NX0RFVl9OUzsKKyNlbmRpZgorCisvKiBTeXN0ZW0gdGltZXJzICovCisjaWZkZWYgU1lTVElNRVIwX0FSTVY4X01fUworI2luY2x1ZGUgInN5c3RpbWVyX2FybXY4LW1fZHJ2LmgiCitleHRlcm4gc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIwX0FSTVY4X01fREVWX1M7CisjZW5kaWYKKyNpZmRlZiBTWVNUSU1FUjBfQVJNVjhfTV9OUworI2luY2x1ZGUgInN5c3RpbWVyX2FybXY4LW1fZHJ2LmgiCitleHRlcm4gc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIwX0FSTVY4X01fREVWX05TOworI2VuZGlmCisKKyNpZmRlZiBTWVNUSU1FUjFfQVJNVjhfTV9TCisjaW5jbHVkZSAic3lzdGltZXJfYXJtdjgtbV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCBTWVNUSU1FUjFfQVJNVjhfTV9ERVZfUzsKKyNlbmRpZgorI2lmZGVmIFNZU1RJTUVSMV9BUk1WOF9NX05TCisjaW5jbHVkZSAic3lzdGltZXJfYXJtdjgtbV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCBTWVNUSU1FUjFfQVJNVjhfTV9ERVZfTlM7CisjZW5kaWYKKworI2lmZGVmIFNZU1RJTUVSMl9BUk1WOF9NX1MKKyNpbmNsdWRlICJzeXN0aW1lcl9hcm12OC1tX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90IFNZU1RJTUVSMl9BUk1WOF9NX0RFVl9TOworI2VuZGlmCisjaWZkZWYgU1lTVElNRVIyX0FSTVY4X01fTlMKKyNpbmNsdWRlICJzeXN0aW1lcl9hcm12OC1tX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90IFNZU1RJTUVSMl9BUk1WOF9NX0RFVl9OUzsKKyNlbmRpZgorCisjaWZkZWYgU1lTVElNRVIzX0FSTVY4X01fUworI2luY2x1ZGUgInN5c3RpbWVyX2FybXY4LW1fZHJ2LmgiCitleHRlcm4gc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIzX0FSTVY4X01fREVWX1M7CisjZW5kaWYKKyNpZmRlZiBTWVNUSU1FUjNfQVJNVjhfTV9OUworI2luY2x1ZGUgInN5c3RpbWVyX2FybXY4LW1fZHJ2LmgiCitleHRlcm4gc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIzX0FSTVY4X01fREVWX05TOworI2VuZGlmCisKKy8qIFN5c3RlbSBXYXRjaGRvZ3MgKi8KKyNpZmRlZiBTWVNXRE9HX0FSTVY4X01fUworI2luY2x1ZGUgInN5c3dkb2dfYXJtdjgtbV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3Qgc3lzd2RvZ19hcm12OF9tX2Rldl90IFNZU1dET0dfQVJNVjhfTV9ERVZfUzsKKyNlbmRpZgorI2lmZGVmIFNZU1dET0dfQVJNVjhfTV9OUworI2luY2x1ZGUgInN5c3dkb2dfYXJtdjgtbV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3Qgc3lzd2RvZ19hcm12OF9tX2Rldl90IFNZU1dET0dfQVJNVjhfTV9ERVZfTlM7CisjZW5kaWYKKworLyogQVJNIE1QQyBTSUUgMzAwIGRyaXZlciBzdHJ1Y3R1cmVzICovCisjaWZkZWYgTVBDX1NSQU1fUworI2luY2x1ZGUgIm1wY19zaWVfZHJ2LmgiCitleHRlcm4gc3RydWN0IG1wY19zaWVfZGV2X3QgTVBDX1NSQU1fREVWX1M7CisjZW5kaWYKKworI2lmZGVmIE1QQ19RU1BJX1MKKyNpbmNsdWRlICJtcGNfc2llX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBtcGNfc2llX2Rldl90IE1QQ19RU1BJX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBNUENfRERSNF9TCisjaW5jbHVkZSAibXBjX3NpZV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgbXBjX3NpZV9kZXZfdCBNUENfRERSNF9ERVZfUzsKKyNlbmRpZgorCisjaWZkZWYgTVBDX0lTUkFNMF9TCisjaW5jbHVkZSAibXBjX3NpZV9kcnYuaCIKK2V4dGVybiBzdHJ1Y3QgbXBjX3NpZV9kZXZfdCBNUENfSVNSQU0wX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBNUENfSVNSQU0xX1MKKyNpbmNsdWRlICJtcGNfc2llX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBtcGNfc2llX2Rldl90IE1QQ19JU1JBTTFfREVWX1M7CisjZW5kaWYKKworI2lmZGVmIE1QUzNfSU9fUworI2luY2x1ZGUgImFybV9tcHMzX2lvX2Rydi5oIgorZXh0ZXJuIHN0cnVjdCBhcm1fbXBzM19pb19kZXZfdCBNUFMzX0lPX0RFVl9TOworI2VuZGlmCisKKyNpZmRlZiBNUFMzX0lPX05TCisjaW5jbHVkZSAiYXJtX21wczNfaW9fZHJ2LmgiCitleHRlcm4gc3RydWN0IGFybV9tcHMzX2lvX2Rldl90IE1QUzNfSU9fREVWX05TOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAgLyogX19ERVZJQ0VfREVGSU5JVElPTl9IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9wbGF0Zm9ybV9kZXNjcmlwdGlvbi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3BsYXRmb3JtX2Rlc2NyaXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwMGMwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9wbGF0Zm9ybV9kZXNjcmlwdGlvbi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1BMQVRGT1JNX0RFU0NSSVBUSU9OX0hfXworI2RlZmluZSBfX1BMQVRGT1JNX0RFU0NSSVBUSU9OX0hfXworCisjaW5jbHVkZSAiY21zaXMuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybV9iYXNlX2FkZHJlc3MuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybV9yZWdzLmgiCisjaW5jbHVkZSAicGxhdGZvcm1fcGlucy5oIgorI2luY2x1ZGUgInN5c3RlbV9jb3JlX2luaXQuaCIKKworI2VuZGlmICAvKiBfX1BMQVRGT1JNX0RFU0NSSVBUSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3BsYXRmb3JtX2lycS5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3BsYXRmb3JtX2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvcGxhdGZvcm1faXJxLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUworICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19QTEFURk9STV9JUlFfSF9fCisjZGVmaW5lIF9fUExBVEZPUk1fSVJRX0hfXworCit0eXBlZGVmIGVudW0gX0lSUW5fVHlwZSB7CisgICAgTm9uTWFza2FibGVJbnRfSVJRbiAgICAgICAgICAgICAgICA9IC0xNCwgIC8qIE5vbiBNYXNrYWJsZSBJbnRlcnJ1cHQgKi8KKyAgICBIYXJkRmF1bHRfSVJRbiAgICAgICAgICAgICAgICAgICAgID0gLTEzLCAgLyogSGFyZEZhdWx0IEludGVycnVwdCAqLworICAgIE1lbW9yeU1hbmFnZW1lbnRfSVJRbiAgICAgICAgICAgICAgPSAtMTIsICAvKiBNZW1vcnkgTWFuYWdlbWVudCBJbnRlcnJ1cHQgKi8KKyAgICBCdXNGYXVsdF9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gLTExLCAgLyogQnVzIEZhdWx0IEludGVycnVwdCAqLworICAgIFVzYWdlRmF1bHRfSVJRbiAgICAgICAgICAgICAgICAgICAgPSAtMTAsICAvKiBVc2FnZSBGYXVsdCBJbnRlcnJ1cHQgKi8KKyAgICBTZWN1cmVGYXVsdF9JUlFuICAgICAgICAgICAgICAgICAgID0gLTksICAgLyogU2VjdXJlIEZhdWx0IEludGVycnVwdCAqLworICAgIFNWQ2FsbF9JUlFuICAgICAgICAgICAgICAgICAgICAgICAgPSAtNSwgICAvKiBTViBDYWxsIEludGVycnVwdCAqLworICAgIERlYnVnTW9uaXRvcl9JUlFuICAgICAgICAgICAgICAgICAgPSAtNCwgICAvKiBEZWJ1ZyBNb25pdG9yIEludGVycnVwdCAqLworICAgIFBlbmRTVl9JUlFuICAgICAgICAgICAgICAgICAgICAgICAgPSAtMiwgICAvKiBQZW5kIFNWIEludGVycnVwdCAqLworICAgIFN5c1RpY2tfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAtMSwgICAvKiBTeXN0ZW0gVGljayBJbnRlcnJ1cHQgKi8KKyAgICBOT05TRUNfV0FUQ0hET0dfUkVTRVRfUkVRX0lSUW4gICAgID0gMCwgICAgLyogTm9uLVNlY3VyZSBXYXRjaGRvZyBSZXNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZXF1ZXN0IEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBOT05TRUNfV0FUQ0hET0dfSVJRbiAgICAgICAgICAgICAgID0gMSwgICAgLyogTm9uLVNlY3VyZSBXYXRjaGRvZyBJbnRlcnJ1cHQgKi8KKyAgICBTTE9XQ0xLX1RJTUVSX0lSUW4gICAgICAgICAgICAgICAgID0gMiwgICAgLyogU0xPV0NMSyBUaW1lciBJbnRlcnJ1cHQgKi8KKyAgICBUSU1FUjBfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyogVElNRVIgMCBJbnRlcnJ1cHQgKi8KKyAgICBUSU1FUjFfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyogVElNRVIgMSBJbnRlcnJ1cHQgKi8KKyAgICBUSU1FUjJfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyogVElNRVIgMiBJbnRlcnJ1cHQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgUmVzZXJ2ZWQgKi8KKyAgICBNUENfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyogTVBDIENvbWJpbmVkIChTZWN1cmUpIEludGVycnVwdCAqLworICAgIFBQQ19JUlFuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKiBQUEMgQ29tYmluZWQgKFNlY3VyZSkgSW50ZXJydXB0ICovCisgICAgTVNDX0lSUW4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qIE1TQyBDb21iaW5lZCAoU2VjdXJlKSBJbnRlcnJwdXQgKi8KKyAgICBCUklER0VfRVJST1JfSVJRbiAgICAgICAgICAgICAgICAgID0gMTIsICAgLyogQnJpZGdlIEVycm9yIENvbWJpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChTZWN1cmUpIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICBDb21iaW5lZF9QUFVfSVJRbiAgICAgICAgICAgICAgICAgID0gMTQsICAgLyogQ29tYmluZWQgUFBVICovCisgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgIFJlc2VydmVkICovCisgICAgRVRIT1NfVTU1X0lSUW4gICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qIE5QVTAgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgUmVzZXJ2ZWQgKi8KKyAgICBUSU1FUjNfQU9OX0lSUW4gICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyogVElNRVIgMyBBT04gSW50ZXJydXB0ICovCisgICAgQ1BVMF9DVElfMF9JUlFuICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qIENQVTAgQ1RJIElSUSAwICovCisgICAgQ1BVMF9DVElfMV9JUlFuICAgICAgICAgICAgICAgICAgICA9IDI5LCAgIC8qIENQVTAgQ1RJIElSUSAxICovCisgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgIFJlc2VydmVkICovCisgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgIFJlc2VydmVkICovCisgICAgU3lzdGVtX1RpbWVzdGFtcF9Db3VudGVyX0lSUW4gICAgICA9IDMyLCAgIC8qIFN5c3RlbSB0aW1lc3RhbXAgY291bnRlciBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUUlgwX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyogVUFSVCAwIFJYIEludGVycnVwdCAqLworICAgIFVBUlRUWDBfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKiBVQVJUIDAgVFggSW50ZXJydXB0ICovCisgICAgVUFSVFJYMV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgIC8qIFVBUlQgMSBSWCBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUVFgxX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgLyogVUFSVCAxIFRYIEludGVycnVwdCAqLworICAgIFVBUlRSWDJfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAvKiBVQVJUIDIgUlggSW50ZXJydXB0ICovCisgICAgVUFSVFRYMl9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qIFVBUlQgMiBUWCBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUUlgzX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgLyogVUFSVCAzIFJYIEludGVycnVwdCAqLworICAgIFVBUlRUWDNfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKiBVQVJUIDMgVFggSW50ZXJydXB0ICovCisgICAgVUFSVFJYNF9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDQxLCAgIC8qIFVBUlQgNCBSWCBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUVFg0X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gNDIsICAgLyogVUFSVCA0IFRYIEludGVycnVwdCAqLworICAgIFVBUlQwX0NvbWJpbmVkX0lSUW4gICAgICAgICAgICAgICAgPSA0MywgICAvKiBVQVJUIDAgQ29tYmluZWQgSW50ZXJydXB0ICovCisgICAgVUFSVDFfQ29tYmluZWRfSVJRbiAgICAgICAgICAgICAgICA9IDQ0LCAgIC8qIFVBUlQgMSBDb21iaW5lZCBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUMl9Db21iaW5lZF9JUlFuICAgICAgICAgICAgICAgID0gNDUsICAgLyogVUFSVCAyIENvbWJpbmVkIEludGVycnVwdCAqLworICAgIFVBUlQzX0NvbWJpbmVkX0lSUW4gICAgICAgICAgICAgICAgPSA0NiwgICAvKiBVQVJUIDMgQ29tYmluZWQgSW50ZXJydXB0ICovCisgICAgVUFSVDRfQ29tYmluZWRfSVJRbiAgICAgICAgICAgICAgICA9IDQ3LCAgIC8qIFVBUlQgNCBDb21iaW5lZCBJbnRlcnJ1cHQgKi8KKyAgICBVQVJUT1ZGX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgLyogVUFSVCAwLCAxLCAyLCAzLCA0ICYgNSBPdmVyZmxvdyBJbnRlcnJ1cHQgKi8KKyAgICBFVEhFUk5FVF9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgLyogRXRoZXJuZXQgSW50ZXJydXB0ICovCisgICAgSTJTX0lSUW4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgIC8qIEF1ZGlvIEkyUyBJbnRlcnJ1cHQgKi8KKyAgICBUT1VDSF9TQ1JFRU5fSVJRbiAgICAgICAgICAgICAgICAgID0gNTEsICAgLyogVG91Y2ggU2NyZWVuIEludGVycnVwdCAqLworICAgIFVTQl9JUlFuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAvKiBVU0IgSW50ZXJydXB0ICovCisgICAgU1BJX0FEQ19JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDUzLCAgIC8qIFNQSSBBREMgSW50ZXJydXB0ICovCisgICAgU1BJX1NISUVMRDBfSVJRbiAgICAgICAgICAgICAgICAgICA9IDU0LCAgIC8qIFNQSSAoU2hpZWxkIDApIEludGVycnVwdCAqLworICAgIFNQSV9TSElFTEQxX0lSUW4gICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKiBTUEkgKFNoaWVsZCAxKSBJbnRlcnJ1cHQgKi8KKyAgICAvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgID0gNTY6NjggICAgUmVzZXJ2ZWQgKi8KKyAgICBHUElPMF9Db21iaW5lZF9JUlFuICAgICAgICAgICAgICAgID0gNjksICAgLyogR1BJTyAwIENvbWJpbmVkIEludGVycnVwdCAqLworICAgIEdQSU8xX0NvbWJpbmVkX0lSUW4gICAgICAgICAgICAgICAgPSA3MCwgICAvKiBHUElPIDEgQ29tYmluZWQgSW50ZXJydXB0ICovCisgICAgR1BJTzJfQ29tYmluZWRfSVJRbiAgICAgICAgICAgICAgICA9IDcxLCAgIC8qIEdQSU8gMiBDb21iaW5lZCBJbnRlcnJ1cHQgKi8KKyAgICBHUElPM19Db21iaW5lZF9JUlFuICAgICAgICAgICAgICAgID0gNzIsICAgLyogR1BJTyAzIENvbWJpbmVkIEludGVycnVwdCAqLworICAgIEdQSU8wXzBfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgLyogR1BJTzAgaGFzIDE2IHBpbnMgd2l0aCBJUlFzICovCisgICAgR1BJTzBfMV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDc0LAorICAgIEdQSU8wXzJfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA3NSwKKyAgICBHUElPMF8zX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gNzYsCisgICAgR1BJTzBfNF9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDc3LAorICAgIEdQSU8wXzVfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwKKyAgICBHUElPMF82X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gNzksCisgICAgR1BJTzBfN19JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDgwLAorICAgIEdQSU8wXzhfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwKKyAgICBHUElPMF85X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gODIsCisgICAgR1BJTzBfMTBfSVJRbiAgICAgICAgICAgICAgICAgICAgICA9IDgzLAorICAgIEdQSU8wXzExX0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSA4NCwKKyAgICBHUElPMF8xMl9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gODUsCisgICAgR1BJTzBfMTNfSVJRbiAgICAgICAgICAgICAgICAgICAgICA9IDg2LAorICAgIEdQSU8wXzE0X0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSA4NywKKyAgICBHUElPMF8xNV9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gODgsCisgICAgR1BJTzFfMF9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDg5LCAgIC8qIEdQSU8xIGhhcyAxNiBwaW5zIHdpdGggSVJRcyAqLworICAgIEdQSU8xXzFfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwKKyAgICBHUElPMV8yX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gOTEsCisgICAgR1BJTzFfM19JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDkyLAorICAgIEdQSU8xXzRfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA5MywKKyAgICBHUElPMV81X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gOTQsCisgICAgR1BJTzFfNl9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDk1LAorICAgIEdQSU8xXzdfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwKKyAgICBHUElPMV84X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gOTcsCisgICAgR1BJTzFfOV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDk4LAorICAgIEdQSU8xXzEwX0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSA5OSwKKyAgICBHUElPMV8xMV9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gMTAwLAorICAgIEdQSU8xXzEyX0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSAxMDEsCisgICAgR1BJTzFfMTNfSVJRbiAgICAgICAgICAgICAgICAgICAgICA9IDEwMiwKKyAgICBHUElPMV8xNF9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gMTAzLAorICAgIEdQSU8xXzE1X0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSAxMDQsCisgICAgR1BJTzJfMF9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAvKiBHUElPMiBoYXMgMTYgcGlucyB3aXRoIElSUXMgKi8KKyAgICBHUElPMl8xX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMTA2LAorICAgIEdQSU8yXzJfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAxMDcsCisgICAgR1BJTzJfM19JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDEwOCwKKyAgICBHUElPMl80X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMTA5LAorICAgIEdQSU8yXzVfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAxMTAsCisgICAgR1BJTzJfNl9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDExMSwKKyAgICBHUElPMl83X0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMTEyLAorICAgIEdQSU8yXzhfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAxMTMsCisgICAgR1BJTzJfOV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDExNCwKKyAgICBHUElPMl8xMF9JUlFuICAgICAgICAgICAgICAgICAgICAgID0gMTE1LAorICAgIEdQSU8yXzExX0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSAxMTYsCisgICAgR1BJTzJfMTJfSVJRbiAgICAgICAgICAgICAgICAgICAgICA9IDExNywKKyAgICBHUElPMl8xM19JUlFuICAgICAgICAgICAgICAgICAgICAgID0gMTE4LAorICAgIEdQSU8yXzE0X0lSUW4gICAgICAgICAgICAgICAgICAgICAgPSAxMTksCisgICAgR1BJTzJfMTVfSVJRbiAgICAgICAgICAgICAgICAgICAgICA9IDEyMCwKKyAgICBHUElPM18wX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMTIxLCAgIC8qIEdQSU8zIGhhcyA0IHBpbnMgd2l0aCBJUlFzICovCisgICAgR1BJTzNfMV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDEyMiwKKyAgICBHUElPM18yX0lSUW4gICAgICAgICAgICAgICAgICAgICAgID0gMTIzLAorICAgIEdQSU8zXzNfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgPSAxMjQsCisgICAgVUFSVFJYNV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDEyNSwgICAvKiBVQVJUIDUgUlggSW50ZXJydXB0ICovCisgICAgVUFSVFRYNV9JUlFuICAgICAgICAgICAgICAgICAgICAgICA9IDEyNiwgICAvKiBVQVJUIDUgVFggSW50ZXJydXB0ICovCisgICAgVUFSVDVfSVJRbiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNywgICAvKiBVQVJUIDUgY29tYmluZWQgSW50ZXJydXB0ICovCisgICAgLyogUmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODoxMzAgICBSZXNlcnZlZCAqLworfSBJUlFuX1R5cGU7CisKKyNlbmRpZiAgLyogX19QTEFURk9STV9JUlFfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvcGxhdGZvcm1fcGlucy5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3BsYXRmb3JtX3BpbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWVkYThjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3BsYXRmb3JtX3BpbnMuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBwbGF0Zm9ybV9waW5zLmgKKyAqIFxicmllZiBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgdGhlIHBpbnMgZm9yIHRoaXMgcGxhdGZvcm0uCisgKi8KKworI2lmbmRlZiBfX1BMQVRGT1JNX1BJTlNfSF9fCisjZGVmaW5lIF9fUExBVEZPUk1fUElOU19IX18KKworLyogQUhCIEdQSU8gcGluIG5hbWVzICovCitlbnVtIGFybV9ncGlvX3Bpbl9uYW1lX3QgeworICAgIEFIQl9HUElPMF8wID0gMFUsCisgICAgQUhCX0dQSU8wXzEsCisgICAgQUhCX0dQSU8wXzIsCisgICAgQUhCX0dQSU8wXzMsCisgICAgQUhCX0dQSU8wXzQsCisgICAgQUhCX0dQSU8wXzUsCisgICAgQUhCX0dQSU8wXzYsCisgICAgQUhCX0dQSU8wXzcsCisgICAgQUhCX0dQSU8wXzgsCisgICAgQUhCX0dQSU8wXzksCisgICAgQUhCX0dQSU8wXzEwLAorICAgIEFIQl9HUElPMF8xMSwKKyAgICBBSEJfR1BJTzBfMTIsCisgICAgQUhCX0dQSU8wXzEzLAorICAgIEFIQl9HUElPMF8xNCwKKyAgICBBSEJfR1BJTzBfMTUsCisgICAgQUhCX0dQSU8xXzAgPSAwVSwKKyAgICBBSEJfR1BJTzFfMSwKKyAgICBBSEJfR1BJTzFfMiwKKyAgICBBSEJfR1BJTzFfMywKKyAgICBBSEJfR1BJTzFfNCwKKyAgICBBSEJfR1BJTzFfNSwKKyAgICBBSEJfR1BJTzFfNiwKKyAgICBBSEJfR1BJTzFfNywKKyAgICBBSEJfR1BJTzFfOCwKKyAgICBBSEJfR1BJTzFfOSwKKyAgICBBSEJfR1BJTzFfMTAsCisgICAgQUhCX0dQSU8xXzExLAorICAgIEFIQl9HUElPMV8xMiwKKyAgICBBSEJfR1BJTzFfMTMsCisgICAgQUhCX0dQSU8xXzE0LAorICAgIEFIQl9HUElPMV8xNSwKKyAgICBBSEJfR1BJTzJfMCA9IDBVLAorICAgIEFIQl9HUElPMl8xLAorICAgIEFIQl9HUElPMl8yLAorICAgIEFIQl9HUElPMl8zLAorICAgIEFIQl9HUElPMl80LAorICAgIEFIQl9HUElPMl81LAorICAgIEFIQl9HUElPMl82LAorICAgIEFIQl9HUElPMl83LAorICAgIEFIQl9HUElPMl84LAorICAgIEFIQl9HUElPMl85LAorICAgIEFIQl9HUElPMl8xMCwKKyAgICBBSEJfR1BJTzJfMTEsCisgICAgQUhCX0dQSU8yXzEyLAorICAgIEFIQl9HUElPMl8xMywKKyAgICBBSEJfR1BJTzJfMTQsCisgICAgQUhCX0dQSU8yXzE1LAorICAgIEFIQl9HUElPM18wID0gMFUsCisgICAgQUhCX0dQSU8zXzEsCisgICAgQUhCX0dQSU8zXzIsCisgICAgQUhCX0dQSU8zXzMsCisgICAgQUhCX0dQSU8zXzQsCisgICAgQUhCX0dQSU8zXzUsCisgICAgQUhCX0dQSU8zXzYsCisgICAgQUhCX0dQSU8zXzcsCisgICAgQUhCX0dQSU8zXzgsCisgICAgQUhCX0dQSU8zXzksCisgICAgQUhCX0dQSU8zXzEwLAorICAgIEFIQl9HUElPM18xMSwKKyAgICBBSEJfR1BJTzNfMTIsCisgICAgQUhCX0dQSU8zXzEzLAorICAgIEFIQl9HUElPM18xNCwKKyAgICBBSEJfR1BJTzNfMTUsCit9OworCisvKiBHUElPIHNoaWVsZCAwIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgU0gwX1VBUlRfUlggICAgICBBSEJfR1BJTzBfMAorI2RlZmluZSBTSDBfVUFSVF9UWCAgICAgIEFIQl9HUElPMF8xCisjZGVmaW5lIFNIMF9TUElfU1MgICAgICAgQUhCX0dQSU8wXzEwCisjZGVmaW5lIFNIMF9TUElfTU9TSSAgICAgQUhCX0dQSU8wXzExCisjZGVmaW5lIFNIMF9TUElfTUlTTyAgICAgQUhCX0dQSU8wXzEyCisjZGVmaW5lIFNIMF9TUElfU0NLICAgICAgQUhCX0dQSU8wXzEzCisjZGVmaW5lIFNIMF9JMkNfU0RBICAgICAgQUhCX0dQSU8wXzE0CisjZGVmaW5lIFNIMF9JMkNfU0NMICAgICAgQUhCX0dQSU8wXzE1CisKKy8qIEdQSU8gc2hpZWxkIDEgZGVmaW5pdGlvbiAqLworI2RlZmluZSBTSDFfVUFSVF9SWCAgICAgIEFIQl9HUElPMV8wCisjZGVmaW5lIFNIMV9VQVJUX1RYICAgICAgQUhCX0dQSU8xXzEKKworI2RlZmluZSBTSDFfU1BJX1NTICAgICAgIEFIQl9HUElPMV8xMAorI2RlZmluZSBTSDFfU1BJX01PU0kgICAgIEFIQl9HUElPMV8xMQorI2RlZmluZSBTSDFfU1BJX01JU08gICAgIEFIQl9HUElPMV8xMgorI2RlZmluZSBTSDFfU1BJX1NDSyAgICAgIEFIQl9HUElPMV8xMworI2RlZmluZSBTSDFfSTJDX1NEQSAgICAgIEFIQl9HUElPMV8xNAorI2RlZmluZSBTSDFfSTJDX1NDTCAgICAgIEFIQl9HUElPMV8xNQorCisjZW5kaWYgIC8qIF9fUExBVEZPUk1fUElOU19IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9wbGF0Zm9ybV9yZWdzLmggYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvcGxhdGZvcm1fcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZGJjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL2luY2x1ZGUvcGxhdGZvcm1fcmVncy5oCkBAIC0wLDAgKzEsNDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgQXJtIExpbWl0ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fUExBVEZPUk1fUkVHU19IX18KKyNkZWZpbmUgX19QTEFURk9STV9SRUdTX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3VyZSBBY2Nlc3MgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBCbG9jayAqLworc3RydWN0IHBvbGFyaXNfc2FjZmdfdCB7CisgICAgdm9sYXRpbGUgdWludDMyX3Qgc3Bjc2VjY3RybDsgICAgIC8qIDB4MDAwIChSL1cpIFNlY3VyZSBQcml2aWxlZ2UgQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmUgQ29uZmlndXJhdGlvbiBDb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgYnVzd2FpdDsgICAgICAgIC8qIDB4MDA0IChSL1cpIEJ1cyBBY2Nlc3Mgd2FpdCBjb250cm9sICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQwWzJdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNlY3Jlc3BjZmc7ICAgICAvKiAweDAxMCAoUi9XKSBTZWN1cml0eSBWaW9sYXRpb24gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG5zY2NmZzsgICAgICAgICAvKiAweDAxNCAoUi9XKSBOb24gU2VjdXJlIENhbGxhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gZm9yIElEQVUgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDE7CisgICAgdm9sYXRpbGUgdWludDMyX3Qgc2VjbXBjaW50c3RhdDsgIC8qIDB4MDFDIChSLyApIFNlY3VyZSBNUEMgSVJRIFN0YXR1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNlY3BwY2ludHN0YXQ7ICAvKiAweDAyMCAoUi8gKSBTZWN1cmUgUFBDIElSUSBTdGF0dXMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNwcGNpbnRjbHI7ICAgLyogMHgwMjQgKFIvVykgU2VjdXJlIFBQQyBJUlEgQ2xlYXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNwcGNpbnRlbjsgICAgLyogMHgwMjggKFIvVykgU2VjdXJlIFBQQyBJUlEgRW5hYmxlICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQyOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNlY21zY2ludHN0YXQ7ICAvKiAweDAzMCAoUi8gKSBTZWN1cmUgTVNDIElSUSBTdGF0dXMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNtc2NpbnRjbHI7ICAgLyogMHgwMzQgKFIvVykgU2VjdXJlIE1TQyBJUlEgQ2xlYXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNtc2NpbnRlbjsgICAgLyogMHgwMzggKFIvVykgU2VjdXJlIE1TQyBJUlEgRW5hYmxlICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQzOworICAgIHZvbGF0aWxlIHVpbnQzMl90IGJyZ2ludHN0YXQ7ICAgICAvKiAweDA0MCAoUi8gKSBCcmlkZ2UgQnVmZmVyIEVycm9yIElSUQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTdGF0dXMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBicmdpbnRjbHI7ICAgICAgLyogMHgwNDQgKFIvVykgQnJpZGdlIEJ1ZmZlciBFcnJvciBJUlEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ2xlYXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBicmdpbnRlbjsgICAgICAgLyogMHgwNDggKFIvVykgQnJpZGdlIEJ1ZmZlciBFcnJvciBJUlEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgRW5hYmxlICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ0OworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5uc3BwYzA7ICAgICAvKiAweDA1MCAoUi9XKSBOb24tc2VjdXJlIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uIHRoZSBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkNVszXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcGNleHAwOyAgLyogMHgwNjAgKFIvVykgRXhwYW5zaW9uIDAgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE1haW4gSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBjZXhwMTsgIC8qIDB4MDY0IChSL1cpIEV4cGFuc2lvbiAxIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQWNjZXNzIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUHJvdGVjdGlvbiBDb250cm9sIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBNYWluIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5uc3BwY2V4cDI7ICAvKiAweDA2OCAoUi9XKSBFeHBhbnNpb24gMiBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgTWFpbiBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcGNleHAzOyAgLyogMHgwNkMgKFIvVykgRXhwYW5zaW9uIDMgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE1haW4gSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcGMwOyAgIC8qIDB4MDcwIChSL1cpIE5vbi1zZWN1cmUgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDAgb24gdGhlIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcGMxOyAgIC8qIDB4MDc0IChSL1cpIE5vbi1zZWN1cmUgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDEgb24gdGhlIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ2WzJdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMDsvKiAweDA4MCAoUi9XKSBFeHBhbnNpb24gMCBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMTsvKiAweDA4NCAoUi9XKSBFeHBhbnNpb24gMSBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMjsvKiAweDA4OCAoUi9XKSBFeHBhbnNpb24gMiBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMzsvKiAweDA4QyAoUi9XKSBFeHBhbnNpb24gMyBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwYzA7ICAgICAvKiAweDA5MCAoUi9XKSBTZWN1cmUgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uIE1haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ3WzNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDA7ICAvKiAweDBBMCAoUi9XKSBFeHBhbnNpb24gMCBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDE7ICAvKiAweDBBNCAoUi9XKSBFeHBhbnNpb24gMSBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDI7ICAvKiAweDBBOCAoUi9XKSBFeHBhbnNpb24gMiBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDM7ICAvKiAweDBBQyAoUi9XKSBFeHBhbnNpb24gMyBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaHNwcHBjMDsgICAvKiAweDBCMCAoUi9XKSBTZWN1cmUgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGMxOyAgIC8qIDB4MEI0IChSL1cpIFNlY3VyZSBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDEgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBucHVzcHBvcnBsOyAgICAgLyogMHgwQjggKFIvVykgU2VjdXJlIEFjY2VzcyBOUFUgcHJpdmlsZWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGxldmVsIHJlc2V0IHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGNvbnRyb2wgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDhbMV07CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAwOy8qIDB4MEMwIChSL1cpIEV4cGFuc2lvbiAwIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAxOy8qIDB4MEM0IChSL1cpIEV4cGFuc2lvbiAxIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAyOy8qIDB4MEM4IChSL1cpIEV4cGFuc2lvbiAyIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAzOy8qIDB4MENDIChSL1cpIEV4cGFuc2lvbiAzIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbnNtc2NleHA7ICAgICAgIC8qIDB4MEQwIChSL1cpIEV4cGFuc2lvbiBNU0MgTm9uLVNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb25maWd1cmF0aW9uICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ5Wzk1OV07CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjQ7ICAgICAgICAgIC8qIDB4RkQwIChSLyApIFBlcmlwaGVyYWwgSUQgNCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMTBbM107CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjA7ICAgICAgICAgIC8qIDB4RkUwIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgICAgICAvKiAweEZFNCAoUi8gKSBQZXJpcGhlcmFsIElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMjsgICAgICAgICAgLyogMHhGRTggKFIvICkgUGVyaXBoZXJhbCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjM7ICAgICAgICAgIC8qIDB4RkVDIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgICAgICAvKiAweEZGMCAoUi8gKSBDb21wb25lbnQgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIxOyAgICAgICAgICAvKiAweEZGNCAoUi8gKSBDb21wb25lbnQgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIyOyAgICAgICAgICAvKiAweEZGOCAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgICAgICAvKiAweEZGQyAoUi8gKSBDb21wb25lbnQgSUQgMyAqLworfTsKKworLyogUFBDIGludGVycnVwdCBwb3NpdGlvbiBtYXNrICovCisjZGVmaW5lIFBFUklQSF9QUEMwX0lOVF9QT1NfTUFTSyAgICAgKDFVTCA8PCAwKQorI2RlZmluZSBQRVJJUEhfUFBDMV9JTlRfUE9TX01BU0sgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgUEVSSVBIX1BQQ0VYUDBfSU5UX1BPU19NQVNLICAoMVVMIDw8IDQpCisjZGVmaW5lIFBFUklQSF9QUENFWFAxX0lOVF9QT1NfTUFTSyAgKDFVTCA8PCA1KQorI2RlZmluZSBQRVJJUEhfUFBDRVhQMl9JTlRfUE9TX01BU0sgICgxVUwgPDwgNikKKyNkZWZpbmUgUEVSSVBIX1BQQ0VYUDNfSU5UX1BPU19NQVNLICAoMVVMIDw8IDcpCisjZGVmaW5lIE1BSU5fUFBDMF9JTlRfUE9TX01BU0sgICAgICAgKDFVTCA8PCAxNikKKyNkZWZpbmUgTUFJTl9QUENFWFAwX0lOVF9QT1NfTUFTSyAgICAoMVVMIDw8IDIwKQorI2RlZmluZSBNQUlOX1BQQ0VYUDFfSU5UX1BPU19NQVNLICAgICgxVUwgPDwgMjEpCisjZGVmaW5lIE1BSU5fUFBDRVhQMl9JTlRfUE9TX01BU0sgICAgKDFVTCA8PCAyMikKKyNkZWZpbmUgTUFJTl9QUENFWFAzX0lOVF9QT1NfTUFTSyAgICAoMVVMIDw8IDIzKQorCisvKiBOb24tc2VjdXJlIEFjY2VzcyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIEJsb2NrICovCitzdHJ1Y3QgcG9sYXJpc19uc2FjZmdfdCB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQwWzM2XTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcHBjMDsgICAgIC8qIDB4MDkwIChSL1cpIE5vbi1zZWN1cmUgVW5wcml2aWxlZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUHJvdGVjdGlvbiBDb250cm9sIDAgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE1haW4gSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQxWzNdOworCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBwY2V4cDA7ICAvKiAweDBBMCAoUi9XKSBFeHBhbnNpb24gMCBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbnRyb2wgb24gTWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBwY2V4cDE7ICAvKiAweDBBNCAoUi9XKSBFeHBhbnNpb24gMSBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbnRyb2wgb24gTWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBwY2V4cDI7ICAvKiAweDBBOCAoUi9XKSBFeHBhbnNpb24gMiBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbnRyb2wgb24gTWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBwY2V4cDM7ICAvKiAweDBBQyAoUi9XKSBFeHBhbnNpb24gMyBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbnRyb2wgb24gTWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcHBjMDsgICAvKiAweDBCMCAoUi9XKSBOb24tc2VjdXJlIFVucHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQWNjZXNzIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCAwIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBwYzE7ICAgLyogMHgwQjQgKFIvVykgTm9uLXNlY3VyZSBVbnByaXZpbGVnZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgMSBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBucHVzcHBvcnBsOyAgICAgIC8qIDB4MEI4IChSL1cpIE5vbi1TZWN1cmUgQWNjZXNzIE5QVQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgcHJpdmlsZWdlIGxldmVsIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBzdGF0ZSBjb250cm9sICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQyWzFdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBwY2V4cDA7LyogMHgwQzAgKFIvVykgRXhwYW5zaW9uIDAgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBQcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBwY2V4cDE7LyogMHgwQzQgKFIvVykgRXhwYW5zaW9uIDEgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBQcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBwY2V4cDI7LyogMHgwQzggKFIvVykgRXhwYW5zaW9uIDIgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBQcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBwY2V4cDM7LyogMHgwQ0MgKFIvVykgRXhwYW5zaW9uIDMgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBQcm90ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkM1s5NjBdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI0OyAgICAgICAgICAgLyogMHhGRDAgKFIvICkgUGVyaXBoZXJhbCBJRCA0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ0WzNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIwOyAgICAgICAgICAgLyogMHhGRTAgKFIvICkgUGVyaXBoZXJhbCBJRCAwICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjE7ICAgICAgICAgICAvKiAweEZFNCAoUi8gKSBQZXJpcGhlcmFsIElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMjsgICAgICAgICAgIC8qIDB4RkU4IChSLyApIFBlcmlwaGVyYWwgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIzOyAgICAgICAgICAgLyogMHhGRUMgKFIvICkgUGVyaXBoZXJhbCBJRCAzICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjA7ICAgICAgICAgICAvKiAweEZGMCAoUi8gKSBDb21wb25lbnQgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIxOyAgICAgICAgICAgLyogMHhGRjQgKFIvICkgQ29tcG9uZW50IElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMjsgICAgICAgICAgIC8qIDB4RkY4IChSLyApIENvbXBvbmVudCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjM7ICAgICAgICAgICAvKiAweEZGQyAoUi8gKSBDb21wb25lbnQgSUQgMyAqLworfTsKKworLyogTUFJTiBQUEMwIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKy8qIEVuZCBNQUlOIFBQQzAgcGVyaXBoZXJhbHMgZGVmaW5pdGlvbiAqLworCisvKiBNQUlOIFBQQ0VYUDAgcGVyaXBoZXJhbHMgZGVmaW5pdGlvbiAqLworI2RlZmluZSBHUElPMF9NQUlOX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICAgKDFVTCA8PCAwKQorI2RlZmluZSBHUElPMV9NQUlOX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICAgKDFVTCA8PCAxKQorI2RlZmluZSBHUElPMl9NQUlOX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICAgKDFVTCA8PCAyKQorI2RlZmluZSBHUElPM19NQUlOX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICAgKDFVTCA8PCAzKQorI2RlZmluZSBVU0VSX0FIQjBfTUFJTl9QUENFWFAwX1BPU19NQVNLICAgICAgICAgKDFVTCA8PCA0KQorI2RlZmluZSBVU0VSX0FIQjFfTUFJTl9QUENFWFAwX1BPU19NQVNLICAgICAgICAgKDFVTCA8PCA1KQorI2RlZmluZSBVU0VSX0FIQjJfTUFJTl9QUENFWFAwX1BPU19NQVNLICAgICAgICAgKDFVTCA8PCA2KQorI2RlZmluZSBVU0VSX0FIQjNfTUFJTl9QUENFWFAwX1BPU19NQVNLICAgICAgICAgKDFVTCA8PCA3KQorI2RlZmluZSBVU0JfQU5EX0VUSEVSTkVUX01BSU5fUFBDRVhQMF9QT1NfTUFTSyAgKDFVTCA8PCA4KQorLyogRW5kIE1BSU4gUFBDRVhQMCBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIE1BSU4gUFBDRVhQMSBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisjZGVmaW5lIERNQTFfTUFJTl9QUENFWFAxX1BPU19NQVNLICAgICAgICAgICAgICAgICAoMVVMIDw8IDEpCisjZGVmaW5lIERNQTJfTUFJTl9QUENFWFAxX1BPU19NQVNLICAgICAgICAgICAgICAgICAoMVVMIDw8IDIpCisjZGVmaW5lIERNQTNfTUFJTl9QUENFWFAxX1BPU19NQVNLICAgICAgICAgICAgICAgICAoMVVMIDw8IDMpCisvKiBFbmQgTUFJTiBQUENFWFAxIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKworLyogTUFJTiBQUENFWFAyIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKy8qIEVuZCBNQUlOIFBQQ0VYUDIgcGVyaXBoZXJhbHMgZGVmaW5pdGlvbiAqLworCisvKiBNQUlOIFBQQ0VYUDMgcGVyaXBoZXJhbHMgZGVmaW5pdGlvbiAqLworLyogRW5kIE1BSU4gUFBDRVhQMyBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIFBFUklQSCBQUEMwIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgU1lTVEVNX1RJTUVSMF9QRVJJUEhfUFBDMF9QT1NfTUFTSyAgICAgICAgICgxVUwgPDwgMCkKKyNkZWZpbmUgU1lTVEVNX1RJTUVSMV9QRVJJUEhfUFBDMF9QT1NfTUFTSyAgICAgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgU1lTVEVNX1RJTUVSMl9QRVJJUEhfUFBDMF9QT1NfTUFTSyAgICAgICAgICgxVUwgPDwgMikKKyNkZWZpbmUgU1lTVEVNX1RJTUVSM19QRVJJUEhfUFBDMF9QT1NfTUFTSyAgICAgICAgICgxVUwgPDwgNSkKKyNkZWZpbmUgV0FUQ0hET0dfUEVSSVBIX1BQQzBfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgNikKKy8qIFRoZXJlIGFyZSBzZXBhcmF0ZSBzZWN1cmUgYW5kIG5vbi1zZWN1cmUgd2F0Y2hkb2cgcGVyaXBoZXJhbHMsIHNvIHRoaXMgYml0CisgKiBjYW4gb25seSBiZSB1c2VkIGluIHRoZSB1bnByaXZpbGVnZWQgYWNjZXNzIHJlZ2lzdGVycy4gKi8KKy8qIEVuZCBQRVJJUEggUFBDMCBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIFBFUklQSCBQUEMxIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgU0xPV0NMS19USU1FUl9QRVJJUEhfUFBDMV9QT1NfTUFTSyAgICAgICAgICgxVUwgPDwgMCkKKy8qIEVuZCBQRVJJUEggUFBDMSBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIFBFUklQSCBQUENFWFAwIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVVNFUl9NRU1fQVBCMF9QRVJJUEhfUFBDRVhQMF9QT1NfTUFTSyAgICAgICgxVUwgPDwgMCkKKyNkZWZpbmUgVVNFUl9NRU1fQVBCMV9QRVJJUEhfUFBDRVhQMF9QT1NfTUFTSyAgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgTlBVX0FQQjBfUEVSSVBIX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICgxVUwgPDwgNCkKKyNkZWZpbmUgTlBVX0FQQjFfUEVSSVBIX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICgxVUwgPDwgNSkKKyNkZWZpbmUgTVBDX1NSQU1fUEVSSVBIX1BQQ0VYUDBfUE9TX01BU0sgICAgICAgICAgICgxVUwgPDwgMTMpCisjZGVmaW5lIE1QQ19RU1BJX1BFUklQSF9QUENFWFAwX1BPU19NQVNLICAgICAgICAgICAoMVVMIDw8IDE0KQorI2RlZmluZSBNUENfRERSNF9QRVJJUEhfUFBDRVhQMF9QT1NfTUFTSyAgICAgICAgICAgKDFVTCA8PCAxNSkKKy8qIEVuZCBQRVJJUEggUFBDRVhQMCBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIFBFUklQSCBQUENFWFAxIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlBHQV9JMkNfVE9VQ0hfUEVSSVBIX1BQQ0VYUDFfUE9TX01BU0sgICAgICgxVUwgPDwgMCkKKyNkZWZpbmUgRlBHQV9JMkNfQVVESU9fUEVSSVBIX1BQQ0VYUDFfUE9TX01BU0sgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgRlBHQV9TUElfQURDX1BFUklQSF9QUENFWFAxX1BPU19NQVNLICAgICAgICgxVUwgPDwgMikKKyNkZWZpbmUgRlBHQV9TUElfU0hJRUxEMF9QRVJJUEhfUFBDRVhQMV9QT1NfTUFTSyAgICgxVUwgPDwgMykKKyNkZWZpbmUgRlBHQV9TUElfU0hJRUxEMV9QRVJJUEhfUFBDRVhQMV9QT1NfTUFTSyAgICgxVUwgPDwgNCkKKyNkZWZpbmUgU0JDb25fSTJDX1NISUVMRDBfUEVSSVBIX1BQQ0VYUDFfUE9TX01BU0sgICgxVUwgPDwgNSkKKyNkZWZpbmUgU0JDb25fSTJDX1NISUVMRDFfUEVSSVBIX1BQQ0VYUDFfUE9TX01BU0sgICgxVUwgPDwgNikKKyNkZWZpbmUgRlBHQV9TQkNvbl9JMkNfUEVSSVBIX1BQQ0VYUDFfUE9TX01BU0sgICAgICgxVUwgPDwgOCkKKy8qIEVuZCBQRVJJUEggUFBDRVhQMSBwZXJpcGhlcmFscyBkZWZpbml0aW9uICovCisKKy8qIFBFUklQSCBQUENFWFAyIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlBHQV9TQ0NfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICgxVUwgPDwgMCkKKyNkZWZpbmUgRlBHQV9JMlNfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICgxVUwgPDwgMSkKKyNkZWZpbmUgRlBHQV9JT19QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSyAgICAgICAgICAgICgxVUwgPDwgMikKKyNkZWZpbmUgVUFSVDBfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgMykKKyNkZWZpbmUgVUFSVDFfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgNCkKKyNkZWZpbmUgVUFSVDJfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgNSkKKyNkZWZpbmUgVUFSVDNfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgNikKKyNkZWZpbmUgVUFSVDRfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgNykKKyNkZWZpbmUgVUFSVDVfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0sgICAgICAgICAgICAgICgxVUwgPDwgOCkKKyNkZWZpbmUgQ0xDRF9QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSyAgICAgICAgICAgICAgICgxVUwgPDwgMTApCisjZGVmaW5lIFJUQ19QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSyAgICAgICAgICAgICAgICAoMVVMIDw8IDExKQorLyogRW5kIFBFUklQSCBQUENFWFAyIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKworLyogUEVSSVBIIFBQQ0VYUDMgcGVyaXBoZXJhbHMgZGVmaW5pdGlvbiAqLworLyogRW5kIFBFUklQSCBQUENFWFAzIHBlcmlwaGVyYWxzIGRlZmluaXRpb24gKi8KKworc3RydWN0IGNwdTBfcHdyY3RybF90IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjcHVwd3JjZmc7ICAgICAgLyogMHgwMDAgKFIvVykgQ1BVIDAgTG9jYWwgUG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMFsxMDExXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyNDsgICAgICAgICAgLyogMHhGRDAgKFIvICkgUGVyaXBoZXJhbCBJRCA0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQxWzNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIwOyAgICAgICAgICAvKiAweEZFMCAoUi8gKSBQZXJpcGhlcmFsIElEIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMTsgICAgICAgICAgLyogMHhGRTQgKFIvICkgUGVyaXBoZXJhbCBJRCAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjI7ICAgICAgICAgIC8qIDB4RkU4IChSLyApIFBlcmlwaGVyYWwgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIzOyAgICAgICAgICAvKiAweEZFQyAoUi8gKSBQZXJpcGhlcmFsIElEIDMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMDsgICAgICAgICAgLyogMHhGRjAgKFIvICkgQ29tcG9uZW50IElEIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMTsgICAgICAgICAgLyogMHhGRjQgKFIvICkgQ29tcG9uZW50IElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMjsgICAgICAgICAgLyogMHhGRjggKFIvICkgQ29tcG9uZW50IElEIDIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMzsgICAgICAgICAgLyogMHhGRkMgKFIvICkgQ29tcG9uZW50IElEIDMgKi8KK307CisKK3N0cnVjdCBjcHUwX3NlY2N0cmxfdCB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgY3B1c2VjY2ZnOyAgICAgIC8qIDB4MDAwIChSL1cpIENQVSBMb2NhbCBTZWN1cml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb25maWd1cmF0aW9uICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQwWzEwMTFdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI0OyAgICAgICAgICAvKiAweEZEMCAoUi8gKSBQZXJpcGhlcmFsIElEIDQgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDFbM107CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjA7ICAgICAgICAgIC8qIDB4RkUwIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgICAgICAvKiAweEZFNCAoUi8gKSBQZXJpcGhlcmFsIElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMjsgICAgICAgICAgLyogMHhGRTggKFIvICkgUGVyaXBoZXJhbCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjM7ICAgICAgICAgIC8qIDB4RkVDIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgICAgICAvKiAweEZGMCAoUi8gKSBDb21wb25lbnQgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIxOyAgICAgICAgICAvKiAweEZGNCAoUi8gKSBDb21wb25lbnQgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIyOyAgICAgICAgICAvKiAweEZGOCAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgICAgICAvKiAweEZGQyAoUi8gKSBDb21wb25lbnQgSUQgMyAqLworfTsKKworc3RydWN0IHBvbGFyaXNfc3lzaW5mb190IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzb2NfaWRlbnRpdHk7ICAgLyogMHgwMDAgKFIvICkgU29DIElkZW50aXR5IFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgdWludDMyX3Qgc3lzX2NvbmZpZzA7ICAgIC8qIDB4MDA0IChSLyApIFN5c3RlbSBIYXJkd2FyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzeXNfY29uZmlnMTsgICAgLyogMHgwMDggKFIvICkgU3lzdGVtIEhhcmR3YXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMFsxMDA2XTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpaWRyOyAgICAgICAgICAgLyogMHhGQzggKFIvICkgU3Vic3lzdGVtIEltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIElkZW50aXR5ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQxOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI0OyAgICAgICAgICAvKiAweEZEMCAoUi8gKSBQZXJpcGhlcmFsIElEIDQgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDJbM107CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjA7ICAgICAgICAgIC8qIDB4RkUwIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgICAgICAvKiAweEZFNCAoUi8gKSBQZXJpcGhlcmFsIElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMjsgICAgICAgICAgLyogMHhGRTggKFIvICkgUGVyaXBoZXJhbCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjM7ICAgICAgICAgIC8qIDB4RkVDIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgICAgICAvKiAweEZGMCAoUi8gKSBDb21wb25lbnQgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIxOyAgICAgICAgICAvKiAweEZGNCAoUi8gKSBDb21wb25lbnQgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIyOyAgICAgICAgICAvKiAweEZGOCAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgICAgICAvKiAweEZGQyAoUi8gKSBDb21wb25lbnQgSUQgMyAqLworfTsKKworc3RydWN0IHBvbGFyaXNfc3lzY3RybF90IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNkYmdzdGF0OyAgICAgICAgLyogMHgwMDAgKFIvICkgU2VjdXJlIERlYnVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gU3RhdHVzICovCisgICAgdm9sYXRpbGUgdWludDMyX3Qgc2VjZGJnc2V0OyAgICAgICAgIC8qIDB4MDA0IChSL1cpIFNlY3VyZSBEZWJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIFNldCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNlY2RiZ2NscjsgICAgICAgICAvKiAweDAwOCAoIC9XKSBTZWN1cmUgRGVidWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBDbGVhciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNjc2VjY3RybDsgICAgICAgICAvKiAweDAwQyAoUi9XKSBTeXN0ZW0gQ29udHJvbCBTZWN1cml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9scyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNsa19jZmcwOyAgICAgICAgICAvKiAweDAxMCAoUi9XKSBDbG9jayBDb25maWd1cmF0aW9uIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjbGtfY2ZnMTsgICAgICAgICAgLyogMHgwMTQgKFIvVykgQ2xvY2sgQ29uZmlndXJhdGlvbiAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2xvY2tfZm9yY2U7ICAgICAgIC8qIDB4MDE4IChSL1cpIENsb2NrIEZvcmNlcyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMFs1N107CisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXRfc3luZHJvbWU7ICAgIC8qIDB4MTAwIChSL1cpIFJlc2V0IHN5bmRyb21lICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXRfbWFzazsgICAgICAgIC8qIDB4MTA0IChSL1cpIFJlc2V0IG1hc2sgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzd3Jlc2V0OyAgICAgICAgICAgLyogMHgxMDggKCAvVykgU29mdHdhcmUgUmVzZXQgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBncmV0cmVnOyAgICAgICAgICAgLyogMHgxMEMgKFIvVykgR2VuZXJhbCBQdXJwb3NlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFJldGVudGlvbiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGluaXRzdnRvcjA7ICAgICAgICAvKiAweDExMCAoUi9XKSBDUFUgMCBJbml0aWFsIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBSZXNldCBWZWN0b3IgUmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDFbM107CisgICAgdm9sYXRpbGUgdWludDMyX3QgY3B1d2FpdDsgICAgICAgICAgIC8qIDB4MTIwIChSL1cpIENQVSBCb290IFdhaXQgQ29udHJvbCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG5taV9lbmFibGU7ICAgICAgICAvKiAweDEyNCAoUi9XKSBOb24gTWFza2FibGUgSW50ZXJydXB0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBFbmFibGUgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDJbNTNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHB3cmN0cmw7ICAgICAgICAgICAvKiAweDFGQyAoUi9XKSBQb3dlciBDb25maWd1cmF0aW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGRjbV9wZF9zeXNfc2Vuc2U7IC8qIDB4MjAwIChSL1cpIFBEQ00gUERfU1lTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFNlbnNpdGl2aXR5ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGRjbV9wZF9jcHUwX3NlbnNlOy8qIDB4MjA0IChSLyApIFBEQ00gUERfQ1BVMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTZW5zaXRpdml0eSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkM1szXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZGNtX3BkX3ZtcjBfc2Vuc2U7LyogMHgyMTQgKFIvVykgUERDTSBQRF9WTVIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFNlbnNpdGl2aXR5ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGRjbV9wZF92bXIxX3NlbnNlOy8qIDB4MjE4IChSL1cpIFBEQ00gUERfVk1SMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBTZW5zaXRpdml0eSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkNFs4NzddOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI0OyAgICAgICAgICAgICAvKiAweEZEMCAoUi8gKSBQZXJpcGhlcmFsIElEIDQgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDVbM107CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjA7ICAgICAgICAgICAgIC8qIDB4RkUwIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgICAgICAgICAvKiAweEZFNCAoUi8gKSBQZXJpcGhlcmFsIElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMjsgICAgICAgICAgICAgLyogMHhGRTggKFIvICkgUGVyaXBoZXJhbCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjM7ICAgICAgICAgICAgIC8qIDB4RkVDIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgICAgICAgICAvKiAweEZGMCAoUi8gKSBDb21wb25lbnQgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIxOyAgICAgICAgICAgICAvKiAweEZGNCAoUi8gKSBDb21wb25lbnQgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIyOyAgICAgICAgICAgICAvKiAweEZGOCAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgICAgICAgICAvKiAweEZGQyAoUi8gKSBDb21wb25lbnQgSUQgMyAqLworfTsKKworc3RydWN0IHBvbGFyaXNfZXdpY190IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBld2ljX2NyOyAgICAgICAgLyogMHgwMDAgKFIvVykgRVdJQyBDb250cm9sICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgZXdpY19hc2NyOyAgICAgIC8qIDB4MDA0IChSL1cpIEF1dG9tYXRpYyBTZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgZXdpY19jbHJtYXNrOyAgIC8qIDB4MDA4ICggL1cpIENsZWFyIEFsbCBNYXNrICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgZXdpY19udW1pZDsgICAgIC8qIDB4MDBDIChSLyApIElEIFJlZ2lzdGVyIGZvciB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIG9mIGV2ZW50cyBzdXBwb3J0ZWQgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDBbMTI0XTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBld2ljX21hc2thOyAgICAgLyogMHgyMDAgKFIvVykgU2V0IHdoaWNoIGludGVybmFsIGV2ZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBjYXVzZSB3YWtldXAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBld2ljX21hc2tbMTVdOyAgLyogMHgyMDQgKFIvVykgU2V0IHdoaWNoIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGludGVycnVwdHMgY2F1c2Ugd2FrZXVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE9ubHkgdGhlIGZpcnN0ICh0b3RhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBzeXN0ZW0gSVJRIG51bWJlcikvMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgcmVnaXN0ZXJzIGFyZSBpbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBpbiBhcnJheSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMVsxMTJdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IGV3aWNfcGVuZGE7ICAgICAvKiAweDQwMCAoUi8gKSBTaG93cyB3aGljaCBpbnRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBpbnRlcnJ1cHRzIHdlcmUgcGVuZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIHdoaWxlIHRoZSBFV0lDIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBlbmFibGVkICovCisKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBld2ljX3BlbmRbMTVdOyAgIC8qIDB4NDA0IChSL1cpIFNob3dzIHdoaWNoIGV4dGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGludGVycnVwdHMgd2VyZSBwZW5kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgd2hpbGUgdGhlIEVXSUMgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgT25seSB0aGUgZmlyc3QgKHRvdGFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIHN5c3RlbSBJUlEgbnVtYmVyKS8zMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICByZWdpc3RlcnMgYXJlIGltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIGluIGFycmF5ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQyWzExMl07CisgICAgdm9sYXRpbGUgdWludDMyX3QgZXdpY19wc3I7ICAgICAgIC8qIDB4NjAwIChSLyApIFBlbmRpbmcgU3VtbWFyeSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkM1s1NzVdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IGl0Y3RybDsgICAgICAgICAvKiAweEYwMCAoUi8gKSBJbnRlZ3JhdGlvbiBNb2RlIENvbnRyb2wgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDRbMzldOworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNsYWltc2V0OyAgICAgICAvKiAweEZBMCAoUi9XKSBDbGFpbSBUYWcgU2V0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2xhaW1jbHI7ICAgICAgIC8qIDB4RkE0IChSL1cpIENsYWltIFRhZyBDbGVhciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGRldmFmZjA7ICAgICAgICAvKiAweEZBOCAoUi8gKSBEZXZpY2UgQWZmaW5pdHkgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGRldmFmZjE7ICAgICAgICAvKiAweEZBQyAoUi8gKSBEZXZpY2UgQWZmaW5pdHkgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGxhcjsgICAgICAgICAgICAvKiAweEZCMCAoIC9XKSBMb2NrIEFjY2VzcyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGxzcjsgICAgICAgICAgICAvKiAweEZCNCAoUi8gKSBMb2NrIFN0YXR1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGF1dGhzdGF0dXM7ICAgICAvKiAweEZCOCAoUi8gKSBBdXRoZW50aWNhdGlvbiBTdGF0dXMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBkZXZhcmNoOyAgICAgICAgLyogMHhGQkMgKFIvICkgRGV2aWNlIEFyY2hpdGVjdHVyZSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGRldmlkMjsgICAgICAgICAvKiAweEZDMCAoUi8gKSBEZXZpY2UgQ29uZmlndXJhdGlvbiAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgZGV2aWQxOyAgICAgICAgIC8qIDB4RkM0IChSLyApIERldmljZSBDb25maWd1cmF0aW9uIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBkZXZpZDsgICAgICAgICAgLyogMHhGQzggKFIvICkgRGV2aWNlIENvbmZpZ3VyYXRpb24gKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBkZXZ0eXBlOyAgICAgICAgLyogMHhGQ0MgKFIvICkgRGV2aWNlIFR5cGUgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyNDsgICAgICAgICAgLyogMHhGRDAgKFIvICkgUGVyaXBoZXJhbCBJRCA0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ1WzNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIwOyAgICAgICAgICAvKiAweEZFMCAoUi8gKSBQZXJpcGhlcmFsIElEIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMTsgICAgICAgICAgLyogMHhGRTQgKFIvICkgUGVyaXBoZXJhbCBJRCAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjI7ICAgICAgICAgIC8qIDB4RkU4IChSLyApIFBlcmlwaGVyYWwgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIzOyAgICAgICAgICAvKiAweEZFQyAoUi8gKSBQZXJpcGhlcmFsIElEIDMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMDsgICAgICAgICAgLyogMHhGRjAgKFIvICkgQ29tcG9uZW50IElEIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMTsgICAgICAgICAgLyogMHhGRjQgKFIvICkgQ29tcG9uZW50IElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMjsgICAgICAgICAgLyogMHhGRjggKFIvICkgQ29tcG9uZW50IElEIDIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMzsgICAgICAgICAgLyogMHhGRkMgKFIvICkgQ29tcG9uZW50IElEIDMgKi8KK307CisjZW5kaWYgLyogX19QTEFURk9STV9SRUdTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9pbmNsdWRlL3N5c3RlbV9jb3JlX2luaXQuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9zeXN0ZW1fY29yZV9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmViYTVlOQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2UvaW5jbHVkZS9zeXN0ZW1fY29yZV9pbml0LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIwIEFybSBMaW1pdGVkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmF0aXZlIG9mIENNU0lTIFY1LjYuMCBzeXN0ZW1fQVJNdjgxTU1MLmgKKyAqIEdpdCBTSEE6IGI1ZjA2MDNkNmE1ODRkMTcyNGQ5NTJmZDhiMDczNzQ1OGI5MGQ2MmIKKyAqLworCisjaWZuZGVmIF9fU1lTVEVNX0NPUkVfSU5JVF9IX18KKyNkZWZpbmUgX19TWVNURU1fQ09SRV9JTklUX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIHVpbnQzMl90IFN5c3RlbUNvcmVDbG9jazsgIC8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykgICovCitleHRlcm4gdWludDMyX3QgUGVyaXBoZXJhbENsb2NrOyAgLyohPCBQZXJpcGhlcmFsIENsb2NrIEZyZXF1ZW5jeSAqLworCisvKioKKyAqIFxicmllZiAgSW5pdGlhbGl6ZXMgdGhlIHN5c3RlbQorICovCitleHRlcm4gdm9pZCBTeXN0ZW1Jbml0KHZvaWQpOworCisvKioKKyAqIFxicmllZiAgUmVzdG9yZXMgc3lzdGVtIGNvcmUgY2xvY2sKKyAqLworZXh0ZXJuIHZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19TWVNURU1fQ09SRV9JTklUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvYXJtY2xhbmcvY29yc3RvbmVfcG9sYXJpc19ibDIuc2N0IGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvYXJtY2xhbmcvY29yc3RvbmVfcG9sYXJpc19ibDIuc2N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmEzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9hcm1jbGFuZy9jb3JzdG9uZV9wb2xhcmlzX2JsMi5zY3QKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNy0yMDIwIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJyZWdpb25fZGVmcy5oIgorCitMUl9DT0RFIEJMMl9DT0RFX1NUQVJUIHsKKyAgICBFUl9DT0RFIEJMMl9DT0RFX1NUQVJUIEJMMl9DT0RFX1NJWkUgeworICAgICAgICAqLm8gKFJFU0VUICtGaXJzdCkKKyAgICAgICAgKiAoK1JPKQorICAgIH0KKworICAgIFRGTV9TSEFSRURfREFUQSBCT09UX1RGTV9TSEFSRURfREFUQV9CQVNFIEFMSUdOIDMyIEVNUFRZIEJPT1RfVEZNX1NIQVJFRF9EQVRBX1NJWkUgeworICAgIH0KKworICAgIEVSX0RBVEEgKzAgeworICAgICAgICAqICgrWkkgK1JXKQorICAgIH0KKworICAgIC8qIE1TUCAqLworICAgIEFSTV9MSUJfU1RBQ0sgKzAgQUxJR04gMzIgRU1QVFkgQkwyX01TUF9TVEFDS19TSVpFIHsKKyAgICB9CisKKyAgICBBUk1fTElCX0hFQVAgKzAgQUxJR04gOCBFTVBUWSBCTDJfSEVBUF9TSVpFIHsKKyAgICB9CisKKyAgICAvKiBUaGlzIGVtcHR5LCB6ZXJvIGxvbmcgZXhlY3V0aW9uIHJlZ2lvbiBpcyBoZXJlIHRvIG1hcmsgdGhlIGxpbWl0IGFkZHJlc3MKKyAgICAgKiBvZiB0aGUgbGFzdCBleGVjdXRpb24gcmVnaW9uIHRoYXQgaXMgYWxsb2NhdGVkIGluIFNSQU0uCisgICAgICovCisgICAgU1JBTV9XQVRFUk1BUksgKzAgRU1QVFkgMHgwIHsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbnMgYWxsb2NhdGVkIGluIHRoZSBTUkFNIGRvZXMgbm90IGV4Y2VlZCB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBTUkFNIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBTY2F0dGVyQXNzZXJ0KEltYWdlTGltaXQoU1JBTV9XQVRFUk1BUkspIDw9IEJMMl9EQVRBX1NUQVJUICsgQkwyX0RBVEFfU0laRSkKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL2FybWNsYW5nL2NvcnN0b25lX3BvbGFyaXNfbnMuc2N0IGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvYXJtY2xhbmcvY29yc3RvbmVfcG9sYXJpc19ucy5zY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3MDdiOQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL2FybWNsYW5nL2NvcnN0b25lX3BvbGFyaXNfbnMuc2N0CkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicmVnaW9uX2RlZnMuaCIKKworTFJfQ09ERSBOU19DT0RFX1NUQVJUIHsKKyAgICBFUl9DT0RFIE5TX0NPREVfU1RBUlQgTlNfQ09ERV9TSVpFIHsKKyAgICAgICAgKi5vIChSRVNFVCArRmlyc3QpCisgICAgICAgICogKCtSTykKKyAgICB9CisKKyAgICBFUl9EQVRBIE5TX0RBVEFfU1RBUlQgeworICAgICAgICAqICgrWkkgK1JXKQorICAgIH0KKworICAgIC8qIE1TUCAqLworICAgIEFSTV9MSUJfU1RBQ0tfTVNQICswIEFMSUdOIDMyIEVNUFRZIE5TX01TUF9TVEFDS19TSVpFIHsKKyAgICB9CisKKyAgICAvKiBQU1AgKi8KKyAgICBBUk1fTElCX1NUQUNLICswIEFMSUdOIDMyIEVNUFRZIE5TX1BTUF9TVEFDS19TSVpFIHsKKyAgICB9CisKKyAgICBBUk1fTElCX0hFQVAgKzAgQUxJR04gOCBFTVBUWSBOU19IRUFQX1NJWkUgeworICAgIH0KKworICAgIC8qIFRoaXMgZW1wdHksIHplcm8gbG9uZyBleGVjdXRpb24gcmVnaW9uIGlzIGhlcmUgdG8gbWFyayB0aGUgbGltaXQgYWRkcmVzcworICAgICAqIG9mIHRoZSBsYXN0IGV4ZWN1dGlvbiByZWdpb24gdGhhdCBpcyBhbGxvY2F0ZWQgaW4gU1JBTS4KKyAgICAgKi8KKyAgICBTUkFNX1dBVEVSTUFSSyArMCBFTVBUWSAweDAgeworICAgIH0KKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbnMgYWxsb2NhdGVkIGluIHRoZSBTUkFNIGRvZXMgbm90IGV4Y2VlZCB0aGUKKyAgICAgKiBzaXplIG9mIHRoZSBTUkFNIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBTY2F0dGVyQXNzZXJ0KEltYWdlTGltaXQoU1JBTV9XQVRFUk1BUkspIDw9IE5TX0RBVEFfU1RBUlQgKyBOU19EQVRBX1NJWkUpCit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9kZXZpY2VfZGVmaW5pdGlvbi5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvZGV2aWNlX2RlZmluaXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJhZjYzCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvZGV2aWNlX2RlZmluaXRpb24uYwpAQCAtMCwwICsxLDY5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBkZXZpY2VfZGVmaW5pdGlvbi5jCisgKiBcYnJpZWYgVGhpcyBmaWxlIGRlZmluZXMgZXhwb3J0cyB0aGUgc3RydWN0dXJlcyBiYXNlZCBvbiB0aGUgcGVyaXBoZXJhbAorICogZGVmaW5pdGlvbnMgZnJvbSBkZXZpY2VfY2ZnLmguCisgKiBUaGlzIGZpbGUgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIGhlbHBlciBmb3IgYmFyZW1ldGFsCisgKiBhcHBsaWNhdGlvbnMgYW5kL29yIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGNvbmZpZ3VyZSB0aGUgZ2VuZXJpYworICogZHJpdmVyIHN0cnVjdHVyZXMuCisgKi8KKworI2luY2x1ZGUgImRldmljZV9kZWZpbml0aW9uLmgiCisjaW5jbHVkZSAicGxhdGZvcm1fYmFzZV9hZGRyZXNzLmgiCisjaW5jbHVkZSAicGxhdGZvcm0vaW5jbHVkZS90Zm1fcGxhdF9kZWZzLmgiCisKKy8qIFVBUlQgQ01TREsgZHJpdmVyIHN0cnVjdHVyZXMgKi8KKyNpZmRlZiBVQVJUMF9DTVNES19TCitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190IFVBUlQwX0NNU0RLX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFVBUlQwX0JBU0VfUywKKyAgICAuZGVmYXVsdF9iYXVkcmF0ZSA9IERFRkFVTFRfVUFSVF9CQVVEUkFURQorfTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9jbXNka19kZXZfZGF0YV90IFVBUlQwX0NNU0RLX0RFVl9EQVRBX1MgPSB7CisgICAgLnN0YXRlID0gMCwKKyAgICAuc3lzdGVtX2NsayA9IDAsCisgICAgLmJhdWRyYXRlID0gMAorfTsKK3N0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQwX0NNU0RLX0RFVl9TID0geworICAgICYoVUFSVDBfQ01TREtfREVWX0NGR19TKSwKKyAgICAmKFVBUlQwX0NNU0RLX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisjaWZkZWYgVUFSVDBfQ01TREtfTlMKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9jbXNka19kZXZfY2ZnX3QgVUFSVDBfQ01TREtfREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFVBUlQwX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfYmF1ZHJhdGUgPSBERUZBVUxUX1VBUlRfQkFVRFJBVEUKK307CitzdGF0aWMgc3RydWN0IHVhcnRfY21zZGtfZGV2X2RhdGFfdCBVQVJUMF9DTVNES19ERVZfREFUQV9OUyA9IHsKKyAgICAuc3RhdGUgPSAwLAorICAgIC5zeXN0ZW1fY2xrID0gMCwKKyAgICAuYmF1ZHJhdGUgPSAwCit9Oworc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDBfQ01TREtfREVWX05TID0geworICAgICYoVUFSVDBfQ01TREtfREVWX0NGR19OUyksCisgICAgJihVQVJUMF9DTVNES19ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworI2lmZGVmIFVBUlQxX0NNU0RLX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9jbXNka19kZXZfY2ZnX3QgVUFSVDFfQ01TREtfREVWX0NGR19TID0geworICAgIC5iYXNlID0gVUFSVDFfQkFTRV9TLAorICAgIC5kZWZhdWx0X2JhdWRyYXRlID0gREVGQVVMVF9VQVJUX0JBVURSQVRFCit9Oworc3RhdGljIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9kYXRhX3QgVUFSVDFfQ01TREtfREVWX0RBVEFfUyA9IHsKKyAgICAuc3RhdGUgPSAwLAorICAgIC5zeXN0ZW1fY2xrID0gMCwKKyAgICAuYmF1ZHJhdGUgPSAwCit9Oworc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDFfQ01TREtfREVWX1MgPSB7CisgICAgJihVQVJUMV9DTVNES19ERVZfQ0ZHX1MpLAorICAgICYoVUFSVDFfQ01TREtfREVWX0RBVEFfUykKK307CisjZW5kaWYKKyNpZmRlZiBVQVJUMV9DTVNES19OUworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9jZmdfdCBVQVJUMV9DTVNES19ERVZfQ0ZHX05TID0geworICAgIC5iYXNlID0gVUFSVDFfQkFTRV9OUywKKyAgICAuZGVmYXVsdF9iYXVkcmF0ZSA9IERFRkFVTFRfVUFSVF9CQVVEUkFURQorfTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9jbXNka19kZXZfZGF0YV90IFVBUlQxX0NNU0RLX0RFVl9EQVRBX05TID0geworICAgIC5zdGF0ZSA9IDAsCisgICAgLnN5c3RlbV9jbGsgPSAwLAorICAgIC5iYXVkcmF0ZSA9IDAKK307CitzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUMV9DTVNES19ERVZfTlMgPSB7CisgICAgJihVQVJUMV9DTVNES19ERVZfQ0ZHX05TKSwKKyAgICAmKFVBUlQxX0NNU0RLX0RFVl9EQVRBX05TKQorfTsKKyNlbmRpZgorCisjaWZkZWYgVUFSVDJfQ01TREtfUworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9jZmdfdCBVQVJUMl9DTVNES19ERVZfQ0ZHX1MgPSB7CisgICAgLmJhc2UgPSBVQVJUMl9CQVNFX1MsCisgICAgLmRlZmF1bHRfYmF1ZHJhdGUgPSBERUZBVUxUX1VBUlRfQkFVRFJBVEUKK307CitzdGF0aWMgc3RydWN0IHVhcnRfY21zZGtfZGV2X2RhdGFfdCBVQVJUMl9DTVNES19ERVZfREFUQV9TID0geworICAgIC5zdGF0ZSA9IDAsCisgICAgLnN5c3RlbV9jbGsgPSAwLAorICAgIC5iYXVkcmF0ZSA9IDAKK307CitzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUMl9DTVNES19ERVZfUyA9IHsKKyAgICAmKFVBUlQyX0NNU0RLX0RFVl9DRkdfUyksCisgICAgJihVQVJUMl9DTVNES19ERVZfREFUQV9TKQorfTsKKyNlbmRpZgorI2lmZGVmIFVBUlQyX0NNU0RLX05TCitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190IFVBUlQyX0NNU0RLX0RFVl9DRkdfTlMgPSB7CisgICAgLmJhc2UgPSBVQVJUMl9CQVNFX05TLAorICAgIC5kZWZhdWx0X2JhdWRyYXRlID0gREVGQVVMVF9VQVJUX0JBVURSQVRFCit9Oworc3RhdGljIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9kYXRhX3QgVUFSVDJfQ01TREtfREVWX0RBVEFfTlMgPSB7CisgICAgLnN0YXRlID0gMCwKKyAgICAuc3lzdGVtX2NsayA9IDAsCisgICAgLmJhdWRyYXRlID0gMAorfTsKK3N0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQyX0NNU0RLX0RFVl9OUyA9IHsKKyAgICAmKFVBUlQyX0NNU0RLX0RFVl9DRkdfTlMpLAorICAgICYoVUFSVDJfQ01TREtfREVWX0RBVEFfTlMpCit9OworI2VuZGlmCisKKyNpZmRlZiBVQVJUM19DTVNES19TCitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190IFVBUlQzX0NNU0RLX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFVBUlQzX0JBU0VfUywKKyAgICAuZGVmYXVsdF9iYXVkcmF0ZSA9IERFRkFVTFRfVUFSVF9CQVVEUkFURQorfTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9jbXNka19kZXZfZGF0YV90IFVBUlQzX0NNU0RLX0RFVl9EQVRBX1MgPSB7CisgICAgLnN0YXRlID0gMCwKKyAgICAuc3lzdGVtX2NsayA9IDAsCisgICAgLmJhdWRyYXRlID0gMAorfTsKK3N0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQzX0NNU0RLX0RFVl9TID0geworICAgICYoVUFSVDNfQ01TREtfREVWX0NGR19TKSwKKyAgICAmKFVBUlQzX0NNU0RLX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisjaWZkZWYgVUFSVDNfQ01TREtfTlMKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9jbXNka19kZXZfY2ZnX3QgVUFSVDNfQ01TREtfREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFVBUlQzX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfYmF1ZHJhdGUgPSBERUZBVUxUX1VBUlRfQkFVRFJBVEUKK307CitzdGF0aWMgc3RydWN0IHVhcnRfY21zZGtfZGV2X2RhdGFfdCBVQVJUM19DTVNES19ERVZfREFUQV9OUyA9IHsKKyAgICAuc3RhdGUgPSAwLAorICAgIC5zeXN0ZW1fY2xrID0gMCwKKyAgICAuYmF1ZHJhdGUgPSAwCit9Oworc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDNfQ01TREtfREVWX05TID0geworICAgICYoVUFSVDNfQ01TREtfREVWX0NGR19OUyksCisgICAgJihVQVJUM19DTVNES19ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworI2lmZGVmIFVBUlQ0X0NNU0RLX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9jbXNka19kZXZfY2ZnX3QgVUFSVDRfQ01TREtfREVWX0NGR19TID0geworICAgIC5iYXNlID0gVUFSVDRfQkFTRV9TLAorICAgIC5kZWZhdWx0X2JhdWRyYXRlID0gREVGQVVMVF9VQVJUX0JBVURSQVRFCit9Oworc3RhdGljIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9kYXRhX3QgVUFSVDRfQ01TREtfREVWX0RBVEFfUyA9IHsKKyAgICAuc3RhdGUgPSAwLAorICAgIC5zeXN0ZW1fY2xrID0gMCwKKyAgICAuYmF1ZHJhdGUgPSAwCit9Oworc3RydWN0IHVhcnRfY21zZGtfZGV2X3QgVUFSVDRfQ01TREtfREVWX1MgPSB7CisgICAgJihVQVJUNF9DTVNES19ERVZfQ0ZHX1MpLAorICAgICYoVUFSVDRfQ01TREtfREVWX0RBVEFfUykKK307CisjZW5kaWYKKyNpZmRlZiBVQVJUNF9DTVNES19OUworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9jZmdfdCBVQVJUNF9DTVNES19ERVZfQ0ZHX05TID0geworICAgIC5iYXNlID0gVUFSVDRfQkFTRV9OUywKKyAgICAuZGVmYXVsdF9iYXVkcmF0ZSA9IERFRkFVTFRfVUFSVF9CQVVEUkFURQorfTsKK3N0YXRpYyBzdHJ1Y3QgdWFydF9jbXNka19kZXZfZGF0YV90IFVBUlQ0X0NNU0RLX0RFVl9EQVRBX05TID0geworICAgIC5zdGF0ZSA9IDAsCisgICAgLnN5c3RlbV9jbGsgPSAwLAorICAgIC5iYXVkcmF0ZSA9IDAKK307CitzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUNF9DTVNES19ERVZfTlMgPSB7CisgICAgJihVQVJUNF9DTVNES19ERVZfQ0ZHX05TKSwKKyAgICAmKFVBUlQ0X0NNU0RLX0RFVl9EQVRBX05TKQorfTsKKyNlbmRpZgorCisjaWZkZWYgVUFSVDVfQ01TREtfUworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9jZmdfdCBVQVJUNV9DTVNES19ERVZfQ0ZHX1MgPSB7CisgICAgLmJhc2UgPSBVQVJUNV9CQVNFX1MsCisgICAgLmRlZmF1bHRfYmF1ZHJhdGUgPSBERUZBVUxUX1VBUlRfQkFVRFJBVEUKK307CitzdGF0aWMgc3RydWN0IHVhcnRfY21zZGtfZGV2X2RhdGFfdCBVQVJUNV9DTVNES19ERVZfREFUQV9TID0geworICAgIC5zdGF0ZSA9IDAsCisgICAgLnN5c3RlbV9jbGsgPSAwLAorICAgIC5iYXVkcmF0ZSA9IDAKK307CitzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCBVQVJUNV9DTVNES19ERVZfUyA9IHsKKyAgICAmKFVBUlQ1X0NNU0RLX0RFVl9DRkdfUyksCisgICAgJihVQVJUNV9DTVNES19ERVZfREFUQV9TKQorfTsKKyNlbmRpZgorI2lmZGVmIFVBUlQ1X0NNU0RLX05TCitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190IFVBUlQ1X0NNU0RLX0RFVl9DRkdfTlMgPSB7CisgICAgLmJhc2UgPSBVQVJUNV9CQVNFX05TLAorICAgIC5kZWZhdWx0X2JhdWRyYXRlID0gREVGQVVMVF9VQVJUX0JBVURSQVRFCit9Oworc3RhdGljIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9kYXRhX3QgVUFSVDVfQ01TREtfREVWX0RBVEFfTlMgPSB7CisgICAgLnN0YXRlID0gMCwKKyAgICAuc3lzdGVtX2NsayA9IDAsCisgICAgLmJhdWRyYXRlID0gMAorfTsKK3N0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90IFVBUlQ1X0NNU0RLX0RFVl9OUyA9IHsKKyAgICAmKFVBUlQ1X0NNU0RLX0RFVl9DRkdfTlMpLAorICAgICYoVUFSVDVfQ01TREtfREVWX0RBVEFfTlMpCit9OworI2VuZGlmCisKKy8qIFBvbGFyaXMgUFBDIGRyaXZlciBzdHJ1Y3R1cmVzICovCisjaWZkZWYgUFBDX1BPTEFSSVNfTUFJTjBfUworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfY2ZnX3QgUFBDX1BPTEFSSVNfTUFJTjBfQ0ZHX1MgPSB7CisgICAgLnNhY2ZnX2Jhc2UgID0gUE9MQVJJU19TQUNGR19CQVNFX1MsCisgICAgLm5zYWNmZ19iYXNlID0gUE9MQVJJU19OU0FDRkdfQkFTRV9OUywKKyAgICAucHBjX25hbWUgPSBQUENfUE9MQVJJU19NQUlOMH07CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfTUFJTjBfREFUQV9TID0geworICAgIC5zYWNmZ19uc19wcGMgID0gMCwKKyAgICAuc2FjZmdfc3BfcHBjICA9IDAsCisgICAgLm5zYWNmZ19uc3BfcHBjID0gMCwKKyAgICAuaW50X2JpdF9tYXNrID0gMCwKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZSB9Oworc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX01BSU4wX0RFVl9TID0geworICAgICZQUENfUE9MQVJJU19NQUlOMF9DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfTUFJTjBfREFUQV9TIH07CisjZW5kaWYKKworI2lmZGVmIFBQQ19QT0xBUklTX01BSU5fRVhQMF9TCitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9jZmdfdCBQUENfUE9MQVJJU19NQUlOX0VYUDBfQ0ZHX1MgPSB7CisgICAgLnNhY2ZnX2Jhc2UgID0gUE9MQVJJU19TQUNGR19CQVNFX1MsCisgICAgLm5zYWNmZ19iYXNlID0gUE9MQVJJU19OU0FDRkdfQkFTRV9OUywKKyAgICAucHBjX25hbWUgPSBQUENfUE9MQVJJU19NQUlOX0VYUDB9Oworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfZGF0YV90IFBQQ19QT0xBUklTX01BSU5fRVhQMF9EQVRBX1MgPSB7CisgICAgLnNhY2ZnX25zX3BwYyAgPSAwLAorICAgIC5zYWNmZ19zcF9wcGMgID0gMCwKKyAgICAubnNhY2ZnX25zcF9wcGMgPSAwLAorICAgIC5pbnRfYml0X21hc2sgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAwX0RFVl9TID0geworICAgICZQUENfUE9MQVJJU19NQUlOX0VYUDBfQ0ZHX1MsCisgICAgJlBQQ19QT0xBUklTX01BSU5fRVhQMF9EQVRBX1MgfTsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX1MKK3N0YXRpYyBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X2NmZ190IFBQQ19QT0xBUklTX01BSU5fRVhQMV9DRkdfUyA9IHsKKyAgICAuc2FjZmdfYmFzZSAgPSBQT0xBUklTX1NBQ0ZHX0JBU0VfUywKKyAgICAubnNhY2ZnX2Jhc2UgPSBQT0xBUklTX05TQUNGR19CQVNFX05TLAorICAgIC5wcGNfbmFtZSA9IFBQQ19QT0xBUklTX01BSU5fRVhQMX07CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0RBVEFfUyA9IHsKKyAgICAuc2FjZmdfbnNfcHBjICA9IDAsCisgICAgLnNhY2ZnX3NwX3BwYyAgPSAwLAorICAgIC5uc2FjZmdfbnNwX3BwYyA9IDAsCisgICAgLmludF9iaXRfbWFzayA9IDAsCisgICAgLmlzX2luaXRpYWxpemVkID0gZmFsc2UgfTsKK3N0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19NQUlOX0VYUDFfREVWX1MgPSB7CisgICAgJlBQQ19QT0xBUklTX01BSU5fRVhQMV9DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfTUFJTl9FWFAxX0RBVEFfUyB9OworI2VuZGlmCisKKyNpZmRlZiBQUENfUE9MQVJJU19NQUlOX0VYUDJfUworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfY2ZnX3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0NGR19TID0geworICAgIC5zYWNmZ19iYXNlICA9IFBPTEFSSVNfU0FDRkdfQkFTRV9TLAorICAgIC5uc2FjZmdfYmFzZSA9IFBPTEFSSVNfTlNBQ0ZHX0JBU0VfTlMsCisgICAgLnBwY19uYW1lID0gUFBDX1BPTEFSSVNfTUFJTl9FWFAyfTsKK3N0YXRpYyBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X2RhdGFfdCBQUENfUE9MQVJJU19NQUlOX0VYUDJfREFUQV9TID0geworICAgIC5zYWNmZ19uc19wcGMgID0gMCwKKyAgICAuc2FjZmdfc3BfcHBjICA9IDAsCisgICAgLm5zYWNmZ19uc3BfcHBjID0gMCwKKyAgICAuaW50X2JpdF9tYXNrID0gMCwKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZSB9Oworc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX01BSU5fRVhQMl9ERVZfUyA9IHsKKyAgICAmUFBDX1BPTEFSSVNfTUFJTl9FWFAyX0NGR19TLAorICAgICZQUENfUE9MQVJJU19NQUlOX0VYUDJfREFUQV9TIH07CisjZW5kaWYKKworI2lmZGVmIFBQQ19QT0xBUklTX01BSU5fRVhQM19TCitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9jZmdfdCBQUENfUE9MQVJJU19NQUlOX0VYUDNfQ0ZHX1MgPSB7CisgICAgLnNhY2ZnX2Jhc2UgID0gUE9MQVJJU19TQUNGR19CQVNFX1MsCisgICAgLm5zYWNmZ19iYXNlID0gUE9MQVJJU19OU0FDRkdfQkFTRV9OUywKKyAgICAucHBjX25hbWUgPSBQUENfUE9MQVJJU19NQUlOX0VYUDN9Oworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfZGF0YV90IFBQQ19QT0xBUklTX01BSU5fRVhQM19EQVRBX1MgPSB7CisgICAgLnNhY2ZnX25zX3BwYyAgPSAwLAorICAgIC5zYWNmZ19zcF9wcGMgID0gMCwKKyAgICAubnNhY2ZnX25zcF9wcGMgPSAwLAorICAgIC5pbnRfYml0X21hc2sgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfTUFJTl9FWFAzX0RFVl9TID0geworICAgICZQUENfUE9MQVJJU19NQUlOX0VYUDNfQ0ZHX1MsCisgICAgJlBQQ19QT0xBUklTX01BSU5fRVhQM19EQVRBX1MgfTsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIMF9TCitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9jZmdfdCBQUENfUE9MQVJJU19QRVJJUEgwX0NGR19TID0geworICAgIC5zYWNmZ19iYXNlICA9IFBPTEFSSVNfU0FDRkdfQkFTRV9TLAorICAgIC5uc2FjZmdfYmFzZSA9IFBPTEFSSVNfTlNBQ0ZHX0JBU0VfTlMsCisgICAgLnBwY19uYW1lID0gUFBDX1BPTEFSSVNfUEVSSVBIMH07CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfUEVSSVBIMF9EQVRBX1MgPSB7CisgICAgLnNhY2ZnX25zX3BwYyAgPSAwLAorICAgIC5zYWNmZ19zcF9wcGMgID0gMCwKKyAgICAubnNhY2ZnX25zcF9wcGMgPSAwLAorICAgIC5pbnRfYml0X21hc2sgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfUEVSSVBIMF9ERVZfUyA9IHsKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIMF9DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIMF9EQVRBX1MgfTsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIMV9TCitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9jZmdfdCBQUENfUE9MQVJJU19QRVJJUEgxX0NGR19TID0geworICAgIC5zYWNmZ19iYXNlICA9IFBPTEFSSVNfU0FDRkdfQkFTRV9TLAorICAgIC5uc2FjZmdfYmFzZSA9IFBPTEFSSVNfTlNBQ0ZHX0JBU0VfTlMsCisgICAgLnBwY19uYW1lID0gUFBDX1BPTEFSSVNfUEVSSVBIMX07CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfUEVSSVBIMV9EQVRBX1MgPSB7CisgICAgLnNhY2ZnX25zX3BwYyAgPSAwLAorICAgIC5zYWNmZ19zcF9wcGMgID0gMCwKKyAgICAubnNhY2ZnX25zcF9wcGMgPSAwLAorICAgIC5pbnRfYml0X21hc2sgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfUEVSSVBIMV9ERVZfUyA9IHsKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIMV9DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIMV9EQVRBX1MgfTsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfUworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfY2ZnX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfQ0ZHX1MgPSB7CisgICAgLnNhY2ZnX2Jhc2UgID0gUE9MQVJJU19TQUNGR19CQVNFX1MsCisgICAgLm5zYWNmZ19iYXNlID0gUE9MQVJJU19OU0FDRkdfQkFTRV9OUywKKyAgICAucHBjX25hbWUgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMH07CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfREFUQV9TID0geworICAgIC5zYWNmZ19uc19wcGMgID0gMCwKKyAgICAuc2FjZmdfc3BfcHBjICA9IDAsCisgICAgLm5zYWNmZ19uc3BfcHBjID0gMCwKKyAgICAuaW50X2JpdF9tYXNrID0gMCwKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZSB9Oworc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAwX0RFVl9TID0geworICAgICZQUENfUE9MQVJJU19QRVJJUEhfRVhQMF9DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDBfREFUQV9TIH07CisjZW5kaWYKKworI2lmZGVmIFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX1MKK3N0YXRpYyBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X2NmZ190IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0NGR19TID0geworICAgIC5zYWNmZ19iYXNlICA9IFBPTEFSSVNfU0FDRkdfQkFTRV9TLAorICAgIC5uc2FjZmdfYmFzZSA9IFBPTEFSSVNfTlNBQ0ZHX0JBU0VfTlMsCisgICAgLnBwY19uYW1lID0gUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDF9Oworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfZGF0YV90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0RBVEFfUyA9IHsKKyAgICAuc2FjZmdfbnNfcHBjICA9IDAsCisgICAgLnNhY2ZnX3NwX3BwYyAgPSAwLAorICAgIC5uc2FjZmdfbnNwX3BwYyA9IDAsCisgICAgLmludF9iaXRfbWFzayA9IDAsCisgICAgLmlzX2luaXRpYWxpemVkID0gZmFsc2UgfTsKK3N0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMV9ERVZfUyA9IHsKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDFfQ0ZHX1MsCisgICAgJlBQQ19QT0xBUklTX1BFUklQSF9FWFAxX0RBVEFfUyB9OworI2VuZGlmCisKKyNpZmRlZiBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9TCitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9jZmdfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9DRkdfUyA9IHsKKyAgICAuc2FjZmdfYmFzZSAgPSBQT0xBUklTX1NBQ0ZHX0JBU0VfUywKKyAgICAubnNhY2ZnX2Jhc2UgPSBQT0xBUklTX05TQUNGR19CQVNFX05TLAorICAgIC5wcGNfbmFtZSA9IFBQQ19QT0xBUklTX1BFUklQSF9FWFAyfTsKK3N0YXRpYyBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X2RhdGFfdCBQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9EQVRBX1MgPSB7CisgICAgLnNhY2ZnX25zX3BwYyAgPSAwLAorICAgIC5zYWNmZ19zcF9wcGMgID0gMCwKKyAgICAubnNhY2ZnX25zcF9wcGMgPSAwLAorICAgIC5pbnRfYml0X21hc2sgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDJfREVWX1MgPSB7CisgICAgJlBQQ19QT0xBUklTX1BFUklQSF9FWFAyX0NGR19TLAorICAgICZQUENfUE9MQVJJU19QRVJJUEhfRVhQMl9EQVRBX1MgfTsKKyNlbmRpZgorCisjaWZkZWYgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfUworc3RhdGljIHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfY2ZnX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfQ0ZHX1MgPSB7CisgICAgLnNhY2ZnX2Jhc2UgID0gUE9MQVJJU19TQUNGR19CQVNFX1MsCisgICAgLm5zYWNmZ19iYXNlID0gUE9MQVJJU19OU0FDRkdfQkFTRV9OUywKKyAgICAucHBjX25hbWUgPSBQUENfUE9MQVJJU19QRVJJUEhfRVhQM307CitzdGF0aWMgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QgUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfREFUQV9TID0geworICAgIC5zYWNmZ19uc19wcGMgID0gMCwKKyAgICAuc2FjZmdfc3BfcHBjICA9IDAsCisgICAgLm5zYWNmZ19uc3BfcHBjID0gMCwKKyAgICAuaW50X2JpdF9tYXNrID0gMCwKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZSB9Oworc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IFBQQ19QT0xBUklTX1BFUklQSF9FWFAzX0RFVl9TID0geworICAgICZQUENfUE9MQVJJU19QRVJJUEhfRVhQM19DRkdfUywKKyAgICAmUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDNfREFUQV9TIH07CisjZW5kaWYKKworLyogU3lzdGVtIGNvdW50ZXJzICovCisjaWZkZWYgU1lTQ09VTlRFUl9DTlRSTF9BUk1WOF9NX1MKKworI2lmIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMF9JTlQgPiBcCisgICAgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfTUFYCisjZXJyb3IgU1lTQ09VTlRFUl9BUk1WOF9NX0RFRkFVTFRfU0NBTEUwX0lOVCBpcyBpbnZhbGlkLgorI2VuZGlmCisjaWYgU1lTQ09VTlRFUl9BUk1WOF9NX0RFRkFVTFRfU0NBTEUwX0ZSQUNUID4gXAorICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfRlJBQ1RfTUFYCisjZXJyb3IgU1lTQ09VTlRFUl9BUk1WOF9NX0RFRkFVTFRfU0NBTEUwX0ZSQUNUIGlzIGludmFsaWQuCisjZW5kaWYKKyNpZiBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTFfSU5UID4gXAorICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfSU5UX01BWAorI2Vycm9yIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMV9JTlQgaXMgaW52YWxpZC4KKyNlbmRpZgorI2lmIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMV9GUkFDVCA+IFwKKyAgICBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWAorI2Vycm9yIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMV9GUkFDVCBpcyBpbnZhbGlkLgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl9jZmdfdAorU1lTQ09VTlRFUl9DTlRSTF9BUk1WOF9NX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFNZU0NOVFJfQ05UUkxfQkFTRV9TLAorICAgIC5zY2FsZTAuaW50ZWdlciAgPSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTBfSU5ULAorICAgIC5zY2FsZTAuZml4ZWRfcG9pbnRfZnJhY3Rpb24gPSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9TQ0FMRTBfRlJBQ1QsCisgICAgLnNjYWxlMS5pbnRlZ2VyICA9IFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMV9JTlQsCisgICAgLnNjYWxlMS5maXhlZF9wb2ludF9mcmFjdGlvbiA9IFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX1NDQUxFMV9GUkFDVAorfTsKK3N0YXRpYyBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl9kYXRhX3QKK1NZU0NPVU5URVJfQ05UUkxfQVJNVjhfTV9ERVZfREFUQV9TID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCBTWVNDT1VOVEVSX0NOVFJMX0FSTVY4X01fREVWX1MgPSB7CisgICAgJihTWVNDT1VOVEVSX0NOVFJMX0FSTVY4X01fREVWX0NGR19TKSwKKyAgICAmKFNZU0NPVU5URVJfQ05UUkxfQVJNVjhfTV9ERVZfREFUQV9TKQorfTsKKyNlbmRpZgorCisjaWZkZWYgU1lTQ09VTlRFUl9SRUFEX0FSTVY4X01fUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fcmVhZF9kZXZfY2ZnX3QKK1NZU0NPVU5URVJfUkVBRF9BUk1WOF9NX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFNZU0NOVFJfUkVBRF9CQVNFX1MsCit9Oworc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9yZWFkX2Rldl90IFNZU0NPVU5URVJfUkVBRF9BUk1WOF9NX0RFVl9TID0geworICAgICYoU1lTQ09VTlRFUl9SRUFEX0FSTVY4X01fREVWX0NGR19TKSwKK307CisjZW5kaWYKKyNpZmRlZiBTWVNDT1VOVEVSX1JFQURfQVJNVjhfTV9OUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fcmVhZF9kZXZfY2ZnX3QKK1NZU0NPVU5URVJfUkVBRF9BUk1WOF9NX0RFVl9DRkdfTlMgPSB7CisgICAgLmJhc2UgPSBTWVNDTlRSX1JFQURfQkFTRV9OUywKK307CitzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX3JlYWRfZGV2X3QgU1lTQ09VTlRFUl9SRUFEX0FSTVY4X01fREVWX05TID0geworICAgICYoU1lTQ09VTlRFUl9DTlRSTF9BUk1WOF9NX0RFVl9DRkdfTlMpLAorfTsKKyNlbmRpZgorCisvKiBTeXN0ZW0gdGltZXJzICovCisjaWZkZWYgU1lTVElNRVIwX0FSTVY4X01fUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9jZmdfdCBTWVNUSU1FUjBfQVJNVjhfTV9ERVZfQ0ZHX1MKKyNpZmRlZiBURVNUX05TX1NMSUhfSVJRCisgICAgVEZNX0xJTktfU0VUX1JPX0lOX1BBUlRJVElPTl9TRUNUSU9OKCJURk1fU1BfU0xJSF9URVNUIiwgIkFQUC1ST1QiKQorI2VsaWYgZGVmaW5lZChURVNUX05TX0ZMSUhfSVJRKQorICAgIFRGTV9MSU5LX1NFVF9ST19JTl9QQVJUSVRJT05fU0VDVElPTigiVEZNX1NQX0ZMSUhfVEVTVCIsICJBUFAtUk9UIikKKyNlbmRpZgorICAgID0geworICAgIC5iYXNlID0gU1lTVElNRVIwX0FSTVY4X01fQkFTRV9TLAorICAgIC5kZWZhdWx0X2ZyZXFfaHogPSBTWVNUSU1FUjBfQVJNVjhNX0RFRkFVTFRfRlJFUV9IWgorfTsKK3N0YXRpYyBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfZGF0YV90IFNZU1RJTUVSMF9BUk1WOF9NX0RFVl9EQVRBX1MKKyNpZmRlZiBURVNUX05TX1NMSUhfSVJRCisgICAgVEZNX0xJTktfU0VUX1JXX0lOX1BBUlRJVElPTl9TRUNUSU9OKCJURk1fU1BfU0xJSF9URVNUIiwgIkFQUC1ST1QiKQorI2VsaWYgZGVmaW5lZChURVNUX05TX0ZMSUhfSVJRKQorICAgIFRGTV9MSU5LX1NFVF9SV19JTl9QQVJUSVRJT05fU0VDVElPTigiVEZNX1NQX0ZMSUhfVEVTVCIsICJBUFAtUk9UIikKKyNlbmRpZgorICAgID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIwX0FSTVY4X01fREVWX1MKKyNpZmRlZiBURVNUX05TX1NMSUhfSVJRCisgICAgVEZNX0xJTktfU0VUX1JXX0lOX1BBUlRJVElPTl9TRUNUSU9OKCJURk1fU1BfU0xJSF9URVNUIiwgIkFQUC1ST1QiKQorI2VsaWYgZGVmaW5lZChURVNUX05TX0ZMSUhfSVJRKQorICAgIFRGTV9MSU5LX1NFVF9SV19JTl9QQVJUSVRJT05fU0VDVElPTigiVEZNX1NQX0ZMSUhfVEVTVCIsICJBUFAtUk9UIikKKyNlbmRpZgorICAgID0geworICAgICYoU1lTVElNRVIwX0FSTVY4X01fREVWX0NGR19TKSwKKyAgICAmKFNZU1RJTUVSMF9BUk1WOF9NX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisKKyNpZmRlZiBTWVNUSU1FUjBfQVJNVjhfTV9OUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9jZmdfdAorU1lTVElNRVIwX0FSTVY4X01fREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSMF9BUk1WOF9NX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfZnJlcV9oeiA9IFNZU1RJTUVSMF9BUk1WOE1fREVGQVVMVF9GUkVRX0haCit9Oworc3RhdGljIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9kYXRhX3QKK1NZU1RJTUVSMF9BUk1WOF9NX0RFVl9EQVRBX05TID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIwX0FSTVY4X01fREVWX05TID0geworICAgICYoU1lTVElNRVIwX0FSTVY4X01fREVWX0NGR19OUyksCisgICAgJihTWVNUSU1FUjBfQVJNVjhfTV9ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworI2lmZGVmIFNZU1RJTUVSMV9BUk1WOF9NX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfY2ZnX3QKK1NZU1RJTUVSMV9BUk1WOF9NX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSMV9BUk1WOF9NX0JBU0VfUywKKyAgICAuZGVmYXVsdF9mcmVxX2h6ID0gU1lTVElNRVIxX0FSTVY4TV9ERUZBVUxUX0ZSRVFfSFoKK307CitzdGF0aWMgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X2RhdGFfdAorU1lTVElNRVIxX0FSTVY4X01fREVWX0RBVEFfUyA9IHsKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZQorfTsKK3N0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90IFNZU1RJTUVSMV9BUk1WOF9NX0RFVl9TID0geworICAgICYoU1lTVElNRVIxX0FSTVY4X01fREVWX0NGR19TKSwKKyAgICAmKFNZU1RJTUVSMV9BUk1WOF9NX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisKKyNpZmRlZiBTWVNUSU1FUjFfQVJNVjhfTV9OUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9jZmdfdAorU1lTVElNRVIxX0FSTVY4X01fREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSMV9BUk1WOF9NX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfZnJlcV9oeiA9IFNZU1RJTUVSMV9BUk1WOE1fREVGQVVMVF9GUkVRX0haCit9Oworc3RhdGljIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9kYXRhX3QKK1NZU1RJTUVSMV9BUk1WOF9NX0RFVl9EQVRBX05TID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIxX0FSTVY4X01fREVWX05TID0geworICAgICYoU1lTVElNRVIxX0FSTVY4X01fREVWX0NGR19OUyksCisgICAgJihTWVNUSU1FUjFfQVJNVjhfTV9ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworI2lmZGVmIFNZU1RJTUVSMl9BUk1WOF9NX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfY2ZnX3QKK1NZU1RJTUVSMl9BUk1WOF9NX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSMl9BUk1WOF9NX0JBU0VfUywKKyAgICAuZGVmYXVsdF9mcmVxX2h6ID0gU1lTVElNRVIyX0FSTVY4TV9ERUZBVUxUX0ZSRVFfSFoKK307CitzdGF0aWMgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X2RhdGFfdAorU1lTVElNRVIyX0FSTVY4X01fREVWX0RBVEFfUyA9IHsKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZQorfTsKK3N0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90IFNZU1RJTUVSMl9BUk1WOF9NX0RFVl9TID0geworICAgICYoU1lTVElNRVIyX0FSTVY4X01fREVWX0NGR19TKSwKKyAgICAmKFNZU1RJTUVSMl9BUk1WOF9NX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisKKyNpZmRlZiBTWVNUSU1FUjJfQVJNVjhfTV9OUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9jZmdfdAorU1lTVElNRVIyX0FSTVY4X01fREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSMl9BUk1WOF9NX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfZnJlcV9oeiA9IFNZU1RJTUVSMl9BUk1WOE1fREVGQVVMVF9GUkVRX0haCit9Oworc3RhdGljIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9kYXRhX3QKK1NZU1RJTUVSMl9BUk1WOF9NX0RFVl9EQVRBX05TID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIyX0FSTVY4X01fREVWX05TID0geworICAgICYoU1lTVElNRVIyX0FSTVY4X01fREVWX0NGR19OUyksCisgICAgJihTWVNUSU1FUjJfQVJNVjhfTV9ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworI2lmZGVmIFNZU1RJTUVSM19BUk1WOF9NX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfY2ZnX3QKK1NZU1RJTUVSM19BUk1WOF9NX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSM19BUk1WOF9NX0JBU0VfUywKKyAgICAuZGVmYXVsdF9mcmVxX2h6ID0gU1lTVElNRVIzX0FSTVY4TV9ERUZBVUxUX0ZSRVFfSFoKK307CitzdGF0aWMgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X2RhdGFfdAorU1lTVElNRVIzX0FSTVY4X01fREVWX0RBVEFfUyA9IHsKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZQorfTsKK3N0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90IFNZU1RJTUVSM19BUk1WOF9NX0RFVl9TID0geworICAgICYoU1lTVElNRVIzX0FSTVY4X01fREVWX0NGR19TKSwKKyAgICAmKFNZU1RJTUVSM19BUk1WOF9NX0RFVl9EQVRBX1MpCit9OworI2VuZGlmCisKKyNpZmRlZiBTWVNUSU1FUjNfQVJNVjhfTV9OUworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9jZmdfdAorU1lTVElNRVIzX0FSTVY4X01fREVWX0NGR19OUyA9IHsKKyAgICAuYmFzZSA9IFNZU1RJTUVSM19BUk1WOF9NX0JBU0VfTlMsCisgICAgLmRlZmF1bHRfZnJlcV9oeiA9IFNZU1RJTUVSM19BUk1WOE1fREVGQVVMVF9GUkVRX0haCit9Oworc3RhdGljIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl9kYXRhX3QKK1NZU1RJTUVSM19BUk1WOF9NX0RFVl9EQVRBX05TID0geworICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlCit9Oworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QgU1lTVElNRVIzX0FSTVY4X01fREVWX05TID0geworICAgICYoU1lTVElNRVIzX0FSTVY4X01fREVWX0NGR19OUyksCisgICAgJihTWVNUSU1FUjNfQVJNVjhfTV9ERVZfREFUQV9OUykKK307CisjZW5kaWYKKworLyogU3lzdGVtIFdhdGNoZG9ncyAqLworI2lmZGVmIFNZU1dET0dfQVJNVjhfTV9TCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c3dkb2dfYXJtdjhfbV9kZXZfY2ZnX3QKK1NZU1dET0dfQVJNVjhfTV9ERVZfQ0ZHX1MgPSB7CisgICAgLmJhc2UgPSBTWVNXRE9HX0FSTVY4X01fQ05UUkxfQkFTRV9TCit9Oworc3RydWN0IHN5c3dkb2dfYXJtdjhfbV9kZXZfdCBTWVNXRE9HX0FSTVY4X01fREVWX1MgPSB7CisgICAgJihTWVNXRE9HX0FSTVY4X01fREVWX0NGR19TKQorfTsKKyNlbmRpZgorCisjaWZkZWYgU1lTV0RPR19BUk1WOF9NX05TCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c3dkb2dfYXJtdjhfbV9kZXZfY2ZnX3QKK1NZU1dET0dfQVJNVjhfTV9ERVZfQ0ZHX05TID0geworICAgIC5iYXNlID0gU1lTV0RPR19BUk1WOF9NX0NOVFJMX0JBU0VfTlMKK307CitzdHJ1Y3Qgc3lzd2RvZ19hcm12OF9tX2Rldl90IFNZU1dET0dfQVJNVjhfTV9ERVZfTlMgPSB7CisgICAgJihTWVNXRE9HX0FSTVY4X01fREVWX0NGR19OUykKK307CisjZW5kaWYKKworLyogQVJNIE1QQyBTSUUgMzAwIGRyaXZlciBzdHJ1Y3R1cmVzICovCisjaWZkZWYgTVBDX1NSQU1fUworc3RhdGljIGNvbnN0IHN0cnVjdCBtcGNfc2llX2Rldl9jZmdfdCBNUENfU1JBTV9ERVZfQ0ZHX1MgPSB7CisgICAgLmJhc2UgPSBNUENfU1JBTV9CQVNFX1N9Oworc3RhdGljIHN0cnVjdCBtcGNfc2llX2Rldl9kYXRhX3QgTVBDX1NSQU1fREVWX0RBVEFfUyA9IHsKKyAgICAucmFuZ2VfbGlzdCA9IDAsCisgICAgLm5icl9vZl9yYW5nZXMgPSAwLAorICAgIC5pc19pbml0aWFsaXplZCA9IGZhbHNlIH07CitzdHJ1Y3QgbXBjX3NpZV9kZXZfdCBNUENfU1JBTV9ERVZfUyA9IHsKKyAgICAmKE1QQ19TUkFNX0RFVl9DRkdfUyksCisgICAgJihNUENfU1JBTV9ERVZfREFUQV9TKX07CisjZW5kaWYKKworI2lmZGVmIE1QQ19RU1BJX1MKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9kZXZfY2ZnX3QgTVBDX1FTUElfREVWX0NGR19TID0geworICAgIC5iYXNlID0gTVBDX1FTUElfQkFTRV9TfTsKK3N0YXRpYyBzdHJ1Y3QgbXBjX3NpZV9kZXZfZGF0YV90IE1QQ19RU1BJX0RFVl9EQVRBX1MgPSB7CisgICAgLnJhbmdlX2xpc3QgPSAwLAorICAgIC5uYnJfb2ZfcmFuZ2VzID0gMCwKKyAgICAuaXNfaW5pdGlhbGl6ZWQgPSBmYWxzZSB9Oworc3RydWN0IG1wY19zaWVfZGV2X3QgTVBDX1FTUElfREVWX1MgPSB7CisgICAgJihNUENfUVNQSV9ERVZfQ0ZHX1MpLAorICAgICYoTVBDX1FTUElfREVWX0RBVEFfUyl9OworI2VuZGlmCisKKyNpZmRlZiBNUENfRERSNF9TCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfZGV2X2NmZ190IE1QQ19ERFI0X0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IE1QQ19ERFI0X0JBU0VfU307CitzdGF0aWMgc3RydWN0IG1wY19zaWVfZGV2X2RhdGFfdCBNUENfRERSNF9ERVZfREFUQV9TID0geworICAgIC5yYW5nZV9saXN0ID0gMCwKKyAgICAubmJyX29mX3JhbmdlcyA9IDAsCisgICAgLmlzX2luaXRpYWxpemVkID0gZmFsc2UgfTsKK3N0cnVjdCBtcGNfc2llX2Rldl90IE1QQ19ERFI0X0RFVl9TID0geworICAgICYoTVBDX0REUjRfREVWX0NGR19TKSwKKyAgICAmKE1QQ19ERFI0X0RFVl9EQVRBX1MpfTsKKyNlbmRpZgorCisjaWZkZWYgTVBDX0lTUkFNMF9TCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfZGV2X2NmZ190IE1QQ19JU1JBTTBfREVWX0NGR19TID0geworICAgIC5iYXNlID0gTVBDX0lTUkFNMF9CQVNFX1N9Oworc3RhdGljIHN0cnVjdCBtcGNfc2llX2Rldl9kYXRhX3QgTVBDX0lTUkFNMF9ERVZfREFUQV9TID0geworICAgIC5yYW5nZV9saXN0ID0gMCwKKyAgICAubmJyX29mX3JhbmdlcyA9IDAsCisgICAgLmlzX2luaXRpYWxpemVkID0gZmFsc2UgfTsKK3N0cnVjdCBtcGNfc2llX2Rldl90IE1QQ19JU1JBTTBfREVWX1MgPSB7CisgICAgJihNUENfSVNSQU0wX0RFVl9DRkdfUyksCisgICAgJihNUENfSVNSQU0wX0RFVl9EQVRBX1MpfTsKKyNlbmRpZgorCisjaWZkZWYgTVBDX0lTUkFNMV9TCitzdGF0aWMgY29uc3Qgc3RydWN0IG1wY19zaWVfZGV2X2NmZ190IE1QQ19JU1JBTTFfREVWX0NGR19TID0geworICAgIC5iYXNlID0gTVBDX0lTUkFNMV9CQVNFX1N9Oworc3RhdGljIHN0cnVjdCBtcGNfc2llX2Rldl9kYXRhX3QgTVBDX0lTUkFNMV9ERVZfREFUQV9TID0geworICAgIC5yYW5nZV9saXN0ID0gMCwKKyAgICAubmJyX29mX3JhbmdlcyA9IDAsCisgICAgLmlzX2luaXRpYWxpemVkID0gZmFsc2UgfTsKK3N0cnVjdCBtcGNfc2llX2Rldl90IE1QQ19JU1JBTTFfREVWX1MgPSB7CisgICAgJihNUENfSVNSQU0xX0RFVl9DRkdfUyksCisgICAgJihNUENfSVNSQU0xX0RFVl9EQVRBX1MpfTsKKyNlbmRpZgorCisjaWZkZWYgTVBTM19JT19TCitzdGF0aWMgc3RydWN0IGFybV9tcHMzX2lvX2Rldl9jZmdfdCBNUFMzX0lPX0RFVl9DRkdfUyA9IHsKKyAgICAuYmFzZSA9IEZQR0FfSU9fQkFTRV9TCit9Oworc3RydWN0IGFybV9tcHMzX2lvX2Rldl90IE1QUzNfSU9fREVWX1MgPSB7CisgICAgLmNmZyA9ICYoTVBTM19JT19ERVZfQ0ZHX1MpCit9OworI2VuZGlmCisKKyNpZmRlZiBNUFMzX0lPX05TCitzdGF0aWMgc3RydWN0IGFybV9tcHMzX2lvX2Rldl9jZmdfdCBNUFMzX0lPX0RFVl9DRkdfTlMgPSB7CisgICAgLmJhc2UgPSBGUEdBX0lPX0JBU0VfTlMKK307CitzdHJ1Y3QgYXJtX21wczNfaW9fZGV2X3QgTVBTM19JT19ERVZfTlMgPSB7CisgICAgLmNmZyA9ICYoTVBTM19JT19ERVZfQ0ZHX05TKQorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvZ2NjL2NvcnN0b25lX3BvbGFyaXNfYmwyLmxkIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvZ2NjL2NvcnN0b25lX3BvbGFyaXNfYmwyLmxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9nY2MvY29yc3RvbmVfcG9sYXJpc19ibDIubGQKQEAgLTAsMCArMSwxOTEgQEAKKzsvKgorOyAqIENvcHlyaWdodCAoYykgMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKzsgKgorOyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzsgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzsgKgorOyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzsgKgorOyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzsgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzsgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzsgKgorOyAqCis7ICogVGhpcyBmaWxlIGlzIGRlcml2YXRpdmUgb2YgQ01TSVMgVjUuMDAgZ2NjX2FybS5sZAorOyAqLworCisvKiBMaW5rZXIgc2NyaXB0IHRvIGNvbmZpZ3VyZSBtZW1vcnkgcmVnaW9ucy4gKi8KKy8qIFRoaXMgZmlsZSB3aWxsIGJlIHJ1biB0cm91Z2ggdGhlIHByZS1wcm9jZXNzb3IuICovCisKKyNpbmNsdWRlICJyZWdpb25fZGVmcy5oIgorCitNRU1PUlkKK3sKKyAgICBGTEFTSCAocngpICA6IE9SSUdJTiA9IEJMMl9DT0RFX1NUQVJULCBMRU5HVEggPSBCTDJfQ09ERV9TSVpFCisgICAgUkFNICAgKHJ3eCkgOiBPUklHSU4gPSBCTDJfREFUQV9TVEFSVCwgTEVOR1RIID0gQkwyX0RBVEFfU0laRQorfQorCitfX2hlYXBfc2l6ZV9fICA9IEJMMl9IRUFQX1NJWkU7CitfX21zcF9zdGFja19zaXplX18gPSBCTDJfTVNQX1NUQUNLX1NJWkU7CisKKy8qIExpYnJhcnkgY29uZmlndXJhdGlvbnMgKi8KK0dST1VQKGxpYmdjYy5hIGxpYmMuYSBsaWJtLmEgbGlibm9zeXMuYSkKKworRU5UUlkoUmVzZXRfSGFuZGxlcikKKworU0VDVElPTlMKK3sKKyAgICAudGV4dCA6CisgICAgeworICAgICAgICBLRUVQKCooLnZlY3RvcnMpKQorICAgICAgICBfX1ZlY3RvcnNfRW5kID0gLjsKKyAgICAgICAgX19WZWN0b3JzX1NpemUgPSBfX1ZlY3RvcnNfRW5kIC0gX19WZWN0b3JzOworICAgICAgICBfX2VuZF9fID0gLjsKKworICAgICAgICAqKC50ZXh0KikKKworICAgICAgICBLRUVQKCooLmluaXQpKQorICAgICAgICBLRUVQKCooLmZpbmkpKQorCisKKyAgICAgICAgLyogLmN0b3JzICovCisgICAgICAgICpjcnRiZWdpbi5vKC5jdG9ycykKKyAgICAgICAgKmNydGJlZ2luPy5vKC5jdG9ycykKKyAgICAgICAgKihFWENMVURFX0ZJTEUoKmNydGVuZD8ubyAqY3J0ZW5kLm8pIC5jdG9ycykKKyAgICAgICAgKihTT1JUKC5jdG9ycy4qKSkKKyAgICAgICAgKiguY3RvcnMpCisKKyAgICAgICAgLyogLmR0b3JzICovCisgICAgICAgICAqY3J0YmVnaW4ubyguZHRvcnMpCisgICAgICAgICAqY3J0YmVnaW4/Lm8oLmR0b3JzKQorICAgICAgICAgKihFWENMVURFX0ZJTEUoKmNydGVuZD8ubyAqY3J0ZW5kLm8pIC5kdG9ycykKKyAgICAgICAgICooU09SVCguZHRvcnMuKikpCisgICAgICAgICAqKC5kdG9ycykKKworICAgICAgICAqKC5yb2RhdGEqKQorCisgICAgICAgIEtFRVAoKiguZWhfZnJhbWUqKSkKKyAgICB9ID4gRkxBU0gKKworICAgIC5BUk0uZXh0YWIgOgorICAgIHsKKyAgICAgICAgKiguQVJNLmV4dGFiKiAuZ251LmxpbmtvbmNlLmFybWV4dGFiLiopCisgICAgfSA+IEZMQVNICisKKyAgICBfX2V4aWR4X3N0YXJ0ID0gLjsKKyAgICAuQVJNLmV4aWR4IDoKKyAgICB7CisgICAgICAgICooLkFSTS5leGlkeCogLmdudS5saW5rb25jZS5hcm1leGlkeC4qKQorICAgIH0gPiBGTEFTSAorICAgIF9fZXhpZHhfZW5kID0gLjsKKworICAgIC8qIFRvIGNvcHkgbXVsdGlwbGUgUk9NIHRvIFJBTSBzZWN0aW9ucywKKyAgICAgKiBkZWZpbmUgZXRleHQyL2RhdGEyX3N0YXJ0L2RhdGEyX2VuZCBhbmQKKyAgICAgKiBkZWZpbmUgX19TVEFSVFVQX0NPUFlfTVVMVElQTEUgaW4gc3RhcnR1cF9jbXNka19tcHMzX2FuNTI0X2JsMi5TICovCisgICAgLmNvcHkudGFibGUgOgorICAgIHsKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICBfX2NvcHlfdGFibGVfc3RhcnRfXyA9IC47CisgICAgICAgIExPTkcgKF9fZXRleHQpCisgICAgICAgIExPTkcgKF9fZGF0YV9zdGFydF9fKQorICAgICAgICBMT05HIChfX2RhdGFfZW5kX18gLSBfX2RhdGFfc3RhcnRfXykKKyAgICAgICAgTE9ORyAoREVGSU5FRChfX2V0ZXh0MikgPyBfX2V0ZXh0MiA6IDApCisgICAgICAgIExPTkcgKERFRklORUQoX19kYXRhMl9zdGFydF9fKSA/IF9fZGF0YTJfc3RhcnRfXyA6IDApCisgICAgICAgIExPTkcgKERFRklORUQoX19kYXRhMl9zdGFydF9fKSA/IF9fZGF0YTJfZW5kX18gLSBfX2RhdGEyX3N0YXJ0X18gOiAwKQorICAgICAgICBfX2NvcHlfdGFibGVfZW5kX18gPSAuOworICAgIH0gPiBGTEFTSAorCisgICAgLyogVG8gY2xlYXIgbXVsdGlwbGUgQlNTIHNlY3Rpb25zLAorICAgICAqIHVuY29tbWVudCAuemVyby50YWJsZSBzZWN0aW9uIGFuZCwKKyAgICAgKiBkZWZpbmUgX19TVEFSVFVQX0NMRUFSX0JTU19NVUxUSVBMRSBpbiBzdGFydHVwX2Ntc2RrX21wczNfYW41MjRfYmwyLlMgKi8KKyAgICAuemVyby50YWJsZSA6CisgICAgeworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIF9femVyb190YWJsZV9zdGFydF9fID0gLjsKKyAgICAgICAgTE9ORyAoX19ic3Nfc3RhcnRfXykKKyAgICAgICAgTE9ORyAoX19ic3NfZW5kX18gLSBfX2Jzc19zdGFydF9fKQorICAgICAgICBMT05HIChERUZJTkVEKF9fYnNzMl9zdGFydF9fKSA/IF9fYnNzMl9zdGFydF9fIDogMCkKKyAgICAgICAgTE9ORyAoREVGSU5FRChfX2JzczJfc3RhcnRfXykgPyBfX2JzczJfZW5kX18gLSBfX2JzczJfc3RhcnRfXyA6IDApCisgICAgICAgIF9femVyb190YWJsZV9lbmRfXyA9IC47CisgICAgfSA+IEZMQVNICisKKyAgICBfX2V0ZXh0ID0gLjsKKworICAgIC50Zm1fYmwyX3NoYXJlZF9kYXRhIDogQUxJR04oMzIpCisgICAgeworICAgICAgICAuICs9IEJPT1RfVEZNX1NIQVJFRF9EQVRBX1NJWkU7CisgICAgfSA+IFJBTQorICAgIEltYWdlJCRTSEFSRURfREFUQSQkUlckJEJhc2UgPSBBRERSKC50Zm1fYmwyX3NoYXJlZF9kYXRhKTsKKyAgICBJbWFnZSQkU0hBUkVEX0RBVEEkJFJXJCRMaW1pdCA9IEFERFIoLnRmbV9ibDJfc2hhcmVkX2RhdGEpICsgU0laRU9GKC50Zm1fYmwyX3NoYXJlZF9kYXRhKTsKKworICAgIC5kYXRhIDogQVQgKF9fZXRleHQpCisgICAgeworICAgICAgICBfX2RhdGFfc3RhcnRfXyA9IC47CisgICAgICAgICoodnRhYmxlKQorICAgICAgICAqKC5kYXRhKikKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC8qIHByZWluaXQgZGF0YSAqLworICAgICAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgICAgIEtFRVAoKigucHJlaW5pdF9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAvKiBpbml0IGRhdGEgKi8KKyAgICAgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgICAgICBLRUVQKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgICAgIEtFRVAoKiguaW5pdF9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC8qIGZpbml0IGRhdGEgKi8KKyAgICAgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgICAgICBLRUVQKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgICAgIEtFRVAoKiguZmluaV9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisKKyAgICAgICAgS0VFUCgqKC5qY3IqKSkKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAvKiBBbGwgZGF0YSBlbmQgKi8KKyAgICAgICAgX19kYXRhX2VuZF9fID0gLjsKKworICAgIH0gPiBSQU0KKyAgICBJbWFnZSQkRVJfREFUQSQkQmFzZSA9IEFERFIoLmRhdGEpOworCisgICAgLmJzcyA6CisgICAgeworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIF9fYnNzX3N0YXJ0X18gPSAuOworICAgICAgICAqKC5ic3MqKQorICAgICAgICAqKENPTU1PTikKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICBfX2Jzc19lbmRfXyA9IC47CisgICAgfSA+IFJBTQorCisgICAgYnNzX3NpemUgPSBfX2Jzc19lbmRfXyAtIF9fYnNzX3N0YXJ0X187CisKKyAgICAubXNwX3N0YWNrIDogQUxJR04oMzIpCisgICAgeworICAgICAgICAuICs9IF9fbXNwX3N0YWNrX3NpemVfXzsKKyAgICB9ID4gUkFNCisgICAgSW1hZ2UkJEFSTV9MSUJfU1RBQ0skJFpJJCRCYXNlID0gQUREUigubXNwX3N0YWNrKTsKKyAgICBJbWFnZSQkQVJNX0xJQl9TVEFDSyQkWkkkJExpbWl0ID0gQUREUigubXNwX3N0YWNrKSArIFNJWkVPRigubXNwX3N0YWNrKTsKKworICAgIC5oZWFwIDogQUxJR04oOCkKKyAgICB7CisgICAgICAgIC4gPSBBTElHTig4KTsKKyAgICAgICAgX19lbmRfXyA9IC47CisgICAgICAgIFBST1ZJREUoZW5kID0gLik7CisgICAgICAgIF9fSGVhcEJhc2UgPSAuOworICAgICAgICAuICs9IF9faGVhcF9zaXplX187CisgICAgICAgIF9fSGVhcExpbWl0ID0gLjsKKyAgICAgICAgX19oZWFwX2xpbWl0ID0gLjsgLyogQWRkIGZvciBfc2JyayAqLworICAgIH0gPiBSQU0KKyAgICBJbWFnZSQkQVJNX0xJQl9IRUFQJCRaSSQkTGltaXQgPSBBRERSKC5oZWFwKSArIFNJWkVPRiguaGVhcCk7CisKKyAgICBQUk9WSURFKF9fc3RhY2sgPSBJbWFnZSQkQVJNX0xJQl9TVEFDSyQkWkkkJExpbWl0KTsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL2djYy9jb3JzdG9uZV9wb2xhcmlzX25zLmxkIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2UvZ2NjL2NvcnN0b25lX3BvbGFyaXNfbnMubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4ODdkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL2djYy9jb3JzdG9uZV9wb2xhcmlzX25zLmxkCkBAIC0wLDAgKzEsMTkwIEBACis7LyoKKzsgKiBDb3B5cmlnaHQgKGMpIDIwMjEgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCis7ICoKKzsgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzsgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7ICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7ICoKKzsgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7ICoKKzsgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7ICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzsgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzsgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7ICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis7ICoKKzsgKgorOyAqIFRoaXMgZmlsZSBpcyBkZXJpdmF0aXZlIG9mIENNU0lTIFY1LjAwIGdjY19hcm0ubGQKKzsgKi8KKworLyogTGlua2VyIHNjcmlwdCB0byBjb25maWd1cmUgbWVtb3J5IHJlZ2lvbnMuICovCisvKiBUaGlzIGZpbGUgd2lsbCBiZSBydW4gdHJvdWdoIHRoZSBwcmUtcHJvY2Vzc29yLiAqLworCisjaW5jbHVkZSAicmVnaW9uX2RlZnMuaCIKKworTUVNT1JZCit7CisgIEZMQVNIIChyeCkgIDogT1JJR0lOID0gTlNfQ09ERV9TVEFSVCwgTEVOR1RIID0gTlNfQ09ERV9TSVpFCisgIFJBTSAgIChyd3gpIDogT1JJR0lOID0gTlNfREFUQV9TVEFSVCwgTEVOR1RIID0gTlNfREFUQV9TSVpFCit9CisKK19faGVhcF9zaXplX18gID0gTlNfSEVBUF9TSVpFOworX19wc3Bfc3RhY2tfc2l6ZV9fID0gTlNfUFNQX1NUQUNLX1NJWkU7CitfX21zcF9zdGFja19zaXplX18gPSBOU19NU1BfU1RBQ0tfU0laRTsKKworLyogTGlicmFyeSBjb25maWd1cmF0aW9ucyAqLworR1JPVVAobGliZ2NjLmEgbGliYy5hIGxpYm0uYSBsaWJub3N5cy5hKQorCitFTlRSWShSZXNldF9IYW5kbGVyKQorCitTRUNUSU9OUworeworICAgIC50ZXh0IDoKKyAgICB7CisgICAgICAgIEtFRVAoKigudmVjdG9ycykpCisgICAgICAgIF9fVmVjdG9yc19FbmQgPSAuOworICAgICAgICBfX1ZlY3RvcnNfU2l6ZSA9IF9fVmVjdG9yc19FbmQgLSBfX1ZlY3RvcnM7CisgICAgICAgIF9fZW5kX18gPSAuOworCisgICAgICAgICooLnRleHQqKQorCisgICAgICAgIEtFRVAoKiguaW5pdCkpCisgICAgICAgIEtFRVAoKiguZmluaSkpCisKKworICAgICAgICAvKiAuY3RvcnMgKi8KKyAgICAgICAgKmNydGJlZ2luLm8oLmN0b3JzKQorICAgICAgICAqY3J0YmVnaW4/Lm8oLmN0b3JzKQorICAgICAgICAqKEVYQ0xVREVfRklMRSgqY3J0ZW5kPy5vICpjcnRlbmQubykgLmN0b3JzKQorICAgICAgICAqKFNPUlQoLmN0b3JzLiopKQorICAgICAgICAqKC5jdG9ycykKKworICAgICAgICAvKiAuZHRvcnMgKi8KKyAgICAgICAgICpjcnRiZWdpbi5vKC5kdG9ycykKKyAgICAgICAgICpjcnRiZWdpbj8ubyguZHRvcnMpCisgICAgICAgICAqKEVYQ0xVREVfRklMRSgqY3J0ZW5kPy5vICpjcnRlbmQubykgLmR0b3JzKQorICAgICAgICAgKihTT1JUKC5kdG9ycy4qKSkKKyAgICAgICAgICooLmR0b3JzKQorCisgICAgICAgICooLnJvZGF0YSopCisKKyAgICAgICAgS0VFUCgqKC5laF9mcmFtZSopKQorICAgIH0gPiBGTEFTSAorCisgICAgLkFSTS5leHRhYiA6CisgICAgeworICAgICAgICAqKC5BUk0uZXh0YWIqIC5nbnUubGlua29uY2UuYXJtZXh0YWIuKikKKyAgICB9ID4gRkxBU0gKKworICAgIF9fZXhpZHhfc3RhcnQgPSAuOworICAgIC5BUk0uZXhpZHggOgorICAgIHsKKyAgICAgICAgKiguQVJNLmV4aWR4KiAuZ251LmxpbmtvbmNlLmFybWV4aWR4LiopCisgICAgfSA+IEZMQVNICisgICAgX19leGlkeF9lbmQgPSAuOworCisgICAgLyogVG8gY29weSBtdWx0aXBsZSBST00gdG8gUkFNIHNlY3Rpb25zLAorICAgICAqIGRlZmluZSBldGV4dDIvZGF0YTJfc3RhcnQvZGF0YTJfZW5kIGFuZAorICAgICAqIGRlZmluZSBfX1NUQVJUVVBfQ09QWV9NVUxUSVBMRSBpbiBzdGFydHVwX2Ntc2RrX21wczNfYW41MjRfbnMuUyAqLworICAgIC5jb3B5LnRhYmxlIDoKKyAgICB7CisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgX19jb3B5X3RhYmxlX3N0YXJ0X18gPSAuOworICAgICAgICBMT05HIChfX2V0ZXh0KQorICAgICAgICBMT05HIChfX2RhdGFfc3RhcnRfXykKKyAgICAgICAgTE9ORyAoX19kYXRhX2VuZF9fIC0gX19kYXRhX3N0YXJ0X18pCisgICAgICAgIExPTkcgKERFRklORUQoX19ldGV4dDIpID8gX19ldGV4dDIgOiAwKQorICAgICAgICBMT05HIChERUZJTkVEKF9fZGF0YTJfc3RhcnRfXykgPyBfX2RhdGEyX3N0YXJ0X18gOiAwKQorICAgICAgICBMT05HIChERUZJTkVEKF9fZGF0YTJfc3RhcnRfXykgPyBfX2RhdGEyX2VuZF9fIC0gX19kYXRhMl9zdGFydF9fIDogMCkKKyAgICAgICAgX19jb3B5X3RhYmxlX2VuZF9fID0gLjsKKyAgICB9ID4gRkxBU0gKKworICAgIC8qIFRvIGNsZWFyIG11bHRpcGxlIEJTUyBzZWN0aW9ucywKKyAgICAgKiB1bmNvbW1lbnQgLnplcm8udGFibGUgc2VjdGlvbiBhbmQsCisgICAgICogZGVmaW5lIF9fU1RBUlRVUF9DTEVBUl9CU1NfTVVMVElQTEUgaW4gc3RhcnR1cF9jbXNka19tcHMzX2FuNTI0X25zLlMgKi8KKyAgICAuemVyby50YWJsZSA6CisgICAgeworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIF9femVyb190YWJsZV9zdGFydF9fID0gLjsKKyAgICAgICAgTE9ORyAoX19ic3Nfc3RhcnRfXykKKyAgICAgICAgTE9ORyAoX19ic3NfZW5kX18gLSBfX2Jzc19zdGFydF9fKQorICAgICAgICBMT05HIChERUZJTkVEKF9fYnNzMl9zdGFydF9fKSA/IF9fYnNzMl9zdGFydF9fIDogMCkKKyAgICAgICAgTE9ORyAoREVGSU5FRChfX2JzczJfc3RhcnRfXykgPyBfX2JzczJfZW5kX18gLSBfX2JzczJfc3RhcnRfXyA6IDApCisgICAgICAgIF9femVyb190YWJsZV9lbmRfXyA9IC47CisgICAgfSA+IEZMQVNICisKKyAgICBfX2V0ZXh0ID0gLjsKKworICAgIC5kYXRhIDogQVQgKF9fZXRleHQpCisgICAgeworICAgICAgICBfX2RhdGFfc3RhcnRfXyA9IC47CisgICAgICAgICoodnRhYmxlKQorICAgICAgICAqKC5kYXRhKikKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC8qIHByZWluaXQgZGF0YSAqLworICAgICAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X3N0YXJ0ID0gLik7CisgICAgICAgIEtFRVAoKigucHJlaW5pdF9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX3ByZWluaXRfYXJyYXlfZW5kID0gLik7CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAvKiBpbml0IGRhdGEgKi8KKyAgICAgICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9zdGFydCA9IC4pOworICAgICAgICBLRUVQKCooU09SVCguaW5pdF9hcnJheS4qKSkpCisgICAgICAgIEtFRVAoKiguaW5pdF9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX2luaXRfYXJyYXlfZW5kID0gLik7CisKKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC8qIGZpbml0IGRhdGEgKi8KKyAgICAgICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOworICAgICAgICBLRUVQKCooU09SVCguZmluaV9hcnJheS4qKSkpCisgICAgICAgIEtFRVAoKiguZmluaV9hcnJheSkpCisgICAgICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7CisKKyAgICAgICAgS0VFUCgqKC5qY3IqKSkKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAvKiBBbGwgZGF0YSBlbmQgKi8KKyAgICAgICAgX19kYXRhX2VuZF9fID0gLjsKKworICAgIH0gPiBSQU0KKworICAgIC5ic3MgOgorICAgIHsKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICBfX2Jzc19zdGFydF9fID0gLjsKKyAgICAgICAgKiguYnNzKikKKyAgICAgICAgKihDT01NT04pCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgX19ic3NfZW5kX18gPSAuOworICAgIH0gPiBSQU0KKworICAgIGJzc19zaXplID0gX19ic3NfZW5kX18gLSBfX2Jzc19zdGFydF9fOworCisgICAgLm1zcF9zdGFjayA6IEFMSUdOKDMyKQorICAgIHsKKyAgICAgICAgLiArPSBfX21zcF9zdGFja19zaXplX187CisgICAgfSA+IFJBTQorICAgIEltYWdlJCRBUk1fTElCX1NUQUNLX01TUCQkWkkkJEJhc2UgPSBBRERSKC5tc3Bfc3RhY2spOworICAgIEltYWdlJCRBUk1fTElCX1NUQUNLX01TUCQkWkkkJExpbWl0ID0gQUREUigubXNwX3N0YWNrKSArIFNJWkVPRigubXNwX3N0YWNrKTsKKworICAgIC5wc3Bfc3RhY2sgOiBBTElHTigzMikKKyAgICB7CisgICAgICAgIC4gKz0gX19wc3Bfc3RhY2tfc2l6ZV9fOworICAgIH0gPiBSQU0KKyAgICBJbWFnZSQkQVJNX0xJQl9TVEFDSyQkWkkkJEJhc2UgPSBBRERSKC5wc3Bfc3RhY2spOworICAgIEltYWdlJCRBUk1fTElCX1NUQUNLJCRaSSQkTGltaXQgPSBBRERSKC5wc3Bfc3RhY2spICsgU0laRU9GKC5wc3Bfc3RhY2spOworCisgICAgLmhlYXAgOiBBTElHTig4KQorICAgIHsKKyAgICAgICAgLiA9IEFMSUdOKDgpOworICAgICAgICBfX2VuZF9fID0gLjsKKyAgICAgICAgUFJPVklERShlbmQgPSAuKTsKKyAgICAgICAgX19IZWFwQmFzZSA9IC47CisgICAgICAgIC4gKz0gX19oZWFwX3NpemVfXzsKKyAgICAgICAgX19IZWFwTGltaXQgPSAuOworICAgICAgICBfX2hlYXBfbGltaXQgPSAuOyAvKiBBZGQgZm9yIF9zYnJrICovCisgICAgfSA+IFJBTQorCisgICAgUFJPVklERShfX3N0YWNrID0gSW1hZ2UkJEFSTV9MSUJfU1RBQ0skJFpJJCRMaW1pdCk7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9zdGFydHVwX2NvcnN0b25lX3BvbGFyaXNfYmwyLmMgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9zdGFydHVwX2NvcnN0b25lX3BvbGFyaXNfYmwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1ODM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19ibDIuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmF0aXZlIG9mIENNU0lTIFY1LjYuMCBzdGFydHVwX0FSTXY4MU1NTC5jCisgKiBHaXQgU0hBOiBiNWYwNjAzZDZhNTg0ZDE3MjRkOTUyZmQ4YjA3Mzc0NThiOTBkNjJiCisgKi8KKworI2luY2x1ZGUgImNtc2lzLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeGNlcHRpb24gLyBJbnRlcnJ1cHQgSGFuZGxlciBGdW5jdGlvbiBQcm90b3R5cGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQoICpwRnVuYyApKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeHRlcm5hbCBSZWZlcmVuY2VzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIHVpbnQzMl90IF9fSU5JVElBTF9TUDsKK2V4dGVybiB1aW50MzJfdCBfX1NUQUNLX0xJTUlUOworCitleHRlcm4gdm9pZCBfX1BST0dSQU1fU1RBUlQodm9pZCkgX19OT19SRVRVUk47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBJbnRlcm5hbCBSZWZlcmVuY2VzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBSZXNldF9IYW5kbGVyICAodm9pZCkgX19OT19SRVRVUk47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeGNlcHRpb24gLyBJbnRlcnJ1cHQgSGFuZGxlcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgREVGQVVMVF9JUlFfSEFORExFUihoYW5kbGVyX25hbWUpICBcCit2b2lkIF9fV0VBSyBoYW5kbGVyX25hbWUodm9pZCkgX19OT19SRVRVUk47IFwKK3ZvaWQgaGFuZGxlcl9uYW1lKHZvaWQpIHsgXAorICAgIHdoaWxlKDEpOyBcCit9CisKKy8qIEV4Y2VwdGlvbnMgKi8KK0RFRkFVTFRfSVJRX0hBTkRMRVIoTk1JX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEhhcmRGYXVsdF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihNZW1NYW5hZ2VfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQnVzRmF1bHRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVXNhZ2VGYXVsdF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTZWN1cmVGYXVsdF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTVkNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoRGVidWdNb25fSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoUGVuZFNWX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFN5c1RpY2tfSGFuZGxlcikKKworREVGQVVMVF9JUlFfSEFORExFUihOT05TRUNfV0FUQ0hET0dfUkVTRVRfUkVRX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE5PTlNFQ19XQVRDSERPR19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTTE9XQ0xLX1RpbWVyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRJTUVSMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihUSU1FUjFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVElNRVIyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE1QQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihQUENfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoTVNDX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEJSSURHRV9FUlJPUl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihDT01CSU5FRF9QUFVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoREVCVUdfUFBVX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRJTUVSM19BT05fSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQ1BVMF9DVElfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihDUFUwX0NUSV8xX0hhbmRsZXIpCisKK0RFRkFVTFRfSVJRX0hBTkRMRVIoU3lzdGVtX1RpbWVzdGFtcF9Db3VudGVyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRSWDBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFRYMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlgxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFJYMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUVFgyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRSWDNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFRYM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlg0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDBfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDFfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDJfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDNfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDRfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVE9WRl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihFVEhFUk5FVF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihJMlNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVE9VQ0hfU0NSRUVOX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVTQl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTUElfQURDX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNQSV9TSElFTEQwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNQSV9TSElFTEQxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEVUSE9TX1U1NV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF9Db21iaW5lZF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV9Db21iaW5lZF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl9Db21iaW5lZF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPM19Db21iaW5lZF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8wX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8zX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF82X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzdfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfOF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF85X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzEwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzExX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzEyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzEzX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzE0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzE1X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV8yX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV81X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfN19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV84X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzlfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMTVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl80X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfNl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl83X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzhfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfOV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8xNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPM18wX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8zXzFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPM18zX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRSWDVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFRYNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUNV9IYW5kbGVyKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRXhjZXB0aW9uIC8gSW50ZXJydXB0IFZlY3RvciB0YWJsZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKCBfX0dOVUNfXyApCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwZWRhbnRpYyIKKyNlbmRpZgorCitleHRlcm4gY29uc3QgcEZ1bmMgX19WRUNUT1JfVEFCTEVbNDk2XTsKKyAgICAgICBjb25zdCBwRnVuYyBfX1ZFQ1RPUl9UQUJMRVs0OTZdIF9fVkVDVE9SX1RBQkxFX0FUVFJJQlVURSA9IHsKKyAgKHBGdW5jKSgmX19JTklUSUFMX1NQKSwgICAgICAgICAgICAvKiAgICAgIEluaXRpYWwgU3RhY2sgUG9pbnRlciAqLworICBSZXNldF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVzZXQgSGFuZGxlciAqLworICBOTUlfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qIC0xNDogTk1JIEhhbmRsZXIgKi8KKyAgSGFyZEZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAvKiAtMTM6IEhhcmQgRmF1bHQgSGFuZGxlciAqLworICBNZW1NYW5hZ2VfSGFuZGxlciwgICAgICAgICAgICAgICAgIC8qIC0xMjogTVBVIEZhdWx0IEhhbmRsZXIgKi8KKyAgQnVzRmF1bHRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAtMTE6IEJ1cyBGYXVsdCBIYW5kbGVyICovCisgIFVzYWdlRmF1bHRfSGFuZGxlciwgICAgICAgICAgICAgICAgLyogLTEwOiBVc2FnZSBGYXVsdCBIYW5kbGVyICovCisgIFNlY3VyZUZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgLyogIC05OiBTZWN1cmUgRmF1bHQgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXNlcnZlZCAqLworICBTVkNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICAtNTogU1ZDYWxsIEhhbmRsZXIgKi8KKyAgRGVidWdNb25fSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgLTQ6IERlYnVnIE1vbml0b3IgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVzZXJ2ZWQgKi8KKyAgUGVuZFNWX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAvKiAgLTI6IFBlbmRTViBIYW5kbGVyICovCisgIFN5c1RpY2tfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIC0xOiBTeXNUaWNrIEhhbmRsZXIgKi8KKworICBOT05TRUNfV0FUQ0hET0dfUkVTRVRfUkVRX0hhbmRsZXIsIC8qICAgMDogTm9uLVNlY3VyZSBXYXRjaGRvZyBSZXNldCBSZXF1ZXN0IEhhbmRsZXIgKi8KKyAgTk9OU0VDX1dBVENIRE9HX0hhbmRsZXIsICAgICAgICAgICAvKiAgIDE6IE5vbi1TZWN1cmUgV2F0Y2hkb2cgSGFuZGxlciAqLworICBTTE9XQ0xLX1RpbWVyX0hhbmRsZXIsICAgICAgICAgICAgIC8qICAgMjogU0xPV0NMSyBUaW1lciBIYW5kbGVyICovCisgIFRJTUVSMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgLyogICAzOiBUSU1FUiAwIEhhbmRsZXIgKi8KKyAgVElNRVIxX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAvKiAgIDQ6IFRJTUVSIDEgSGFuZGxlciAqLworICBUSU1FUjJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgIC8qICAgNTogVElNRVIgMiBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICA2OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgNzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDg6IFJlc2VydmVkICovCisgIE1QQ19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogICA5OiBNUEMgQ29tYmluZWQgKFNlY3VyZSkgSGFuZGxlciAqLworICBQUENfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMDogUFBDIENvbWJpbmVkIChTZWN1cmUpIEhhbmRsZXIgKi8KKyAgTVNDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTE6IE1TQyBDb21iaW5lZCAoU2VjdXJlKSBIYW5kbGVyICovCisgIEJSSURHRV9FUlJPUl9IYW5kbGVyLCAgICAgICAgICAgICAgLyogIDEyOiBCcmlkZ2UgRXJyb3IgKFNlY3VyZSkgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMzogUmVzZXJ2ZWQgKi8KKyAgQ09NQklORURfUFBVX0hhbmRsZXIsICAgICAgICAgICAgICAvKiAgMTQ6IENvbWJpbmVkIFBQVSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDE1OiBSZXNlcnZlZCAqLworICBFVEhPU19VNTVfSGFuZGxlciwgICAgICAgICAgICAgICAgIC8qICAxNjogRXRob3MtVTU1IEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTc6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDE4OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxOTogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjA6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIxOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyMjogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjM6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDI0OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyNTogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjY6IFJlc2VydmVkICovCisgIFRJTUVSM19BT05fSGFuZGxlciwgICAgICAgICAgICAgICAgLyogIDI3OiBUSU1FUiAzIEFPTiBIYW5kbGVyICovCisgIENQVTBfQ1RJXzBfSGFuZGxlciwgICAgICAgICAgICAgICAgLyogIDI4OiBDUFUwIENUSSBJUlEgMCBIYW5kbGVyICovCisgIENQVTBfQ1RJXzFfSGFuZGxlciwgICAgICAgICAgICAgICAgLyogIDI5OiBDUFUwIENUSSBJUlEgMSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDMwOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzMTogUmVzZXJ2ZWQgKi8KKworICAvKiBFeHRlcm5hbCBpbnRlcnJ1cHRzICovCisgIFN5c3RlbV9UaW1lc3RhbXBfQ291bnRlcl9IYW5kbGVyLCAgLyogIDMyOiBTeXN0ZW0gdGltZXN0YW1wIGNvdW50ZXIgSGFuZGxlciAqLworICBVQVJUUlgwX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzMzogVUFSVCAwIFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzQ6IFVBUlQgMCBUWCBIYW5kbGVyICovCisgIFVBUlRSWDFfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM1OiBVQVJUIDEgUlggSGFuZGxlciAqLworICBVQVJUVFgxX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzNjogVUFSVCAxIFRYIEhhbmRsZXIgKi8KKyAgVUFSVFJYMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzc6IFVBUlQgMiBSWCBIYW5kbGVyICovCisgIFVBUlRUWDJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM4OiBVQVJUIDIgVFggSGFuZGxlciAqLworICBVQVJUUlgzX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzOTogVUFSVCAzIFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNDA6IFVBUlQgMyBUWCBIYW5kbGVyICovCisgIFVBUlRSWDRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDQxOiBVQVJUIDQgUlggSGFuZGxlciAqLworICBVQVJUVFg0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA0MjogVUFSVCA0IFRYIEhhbmRsZXIgKi8KKyAgVUFSVDBfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNDM6IFVBUlQgMCBDb21iaW5lZCBIYW5kbGVyICovCisgIFVBUlQxX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQ0OiBVQVJUIDEgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUMl9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA0NTogVUFSVCAyIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgVUFSVDNfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNDY6IFVBUlQgMyBDb21iaW5lZCBIYW5kbGVyICovCisgIFVBUlQ0X0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQ3OiBVQVJUIDQgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUT1ZGX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA0ODogVUFSVCAwLCAxLCAyLCAzLCA0ICYgNSBPdmVyZmxvdyBIYW5kbGVyICovCisgIEVUSEVSTkVUX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDQ5OiBFdGhlcm5ldCBIYW5kbGVyICovCisgIEkyU19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDUwOiBBdWRpbyBJMlMgSGFuZGxlciAqLworICBUT1VDSF9TQ1JFRU5fSGFuZGxlciwgICAgICAgICAgICAgIC8qICA1MTogVG91Y2ggU2NyZWVuIEhhbmRsZXIgKi8KKyAgVVNCX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgNTI6IFVTQiBIYW5kbGVyICovCisgIFNQSV9BRENfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDUzOiBTUEkgQURDIEhhbmRsZXIgKi8KKyAgU1BJX1NISUVMRDBfSGFuZGxlciwgICAgICAgICAgICAgICAvKiAgNTQ6IFNQSSAoU2hpZWxkIDApIEhhbmRsZXIgKi8KKyAgU1BJX1NISUVMRDFfSGFuZGxlciwgICAgICAgICAgICAgICAvKiAgNTU6IFNQSSAoU2hpZWxkIDApIEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNTY6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDU3OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1ODogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNTk6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDYwOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2MTogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjI6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDYzOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2NDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjU6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDY2OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2NzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjg6IFJlc2VydmVkICovCisgIEdQSU8wX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDY5OiBHUElPIDAgQ29tYmluZWQgSGFuZGxlciAqLworICBHUElPMV9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA3MDogR1BJTyAxIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgR1BJTzJfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNzE6IEdQSU8gMiBDb21iaW5lZCBIYW5kbGVyICovCisgIEdQSU8zX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDcyOiBHUElPIDMgQ29tYmluZWQgSGFuZGxlciAqLworICBHUElPMF8wX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3MzogR1BJTzAgUGluIDAgSGFuZGxlciAqLworICBHUElPMF8xX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3NDogR1BJTzAgUGluIDEgSGFuZGxlciAqLworICBHUElPMF8yX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3NTogR1BJTzAgUGluIDIgSGFuZGxlciAqLworICBHUElPMF8zX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3NjogR1BJTzAgUGluIDMgSGFuZGxlciAqLworICBHUElPMF80X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3NzogR1BJTzAgUGluIDQgSGFuZGxlciAqLworICBHUElPMF81X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3ODogR1BJTzAgUGluIDUgSGFuZGxlciAqLworICBHUElPMF82X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA3OTogR1BJTzAgUGluIDYgSGFuZGxlciAqLworICBHUElPMF83X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA4MDogR1BJTzAgUGluIDcgSGFuZGxlciAqLworICBHUElPMF84X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA4MTogR1BJTzAgUGluIDggSGFuZGxlciAqLworICBHUElPMF85X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA4MjogR1BJTzAgUGluIDkgSGFuZGxlciAqLworICBHUElPMF8xMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4MzogR1BJTzAgUGluIDEwIEhhbmRsZXIgKi8KKyAgR1BJTzBfMTFfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODQ6IEdQSU8wIFBpbiAxMSBIYW5kbGVyICovCisgIEdQSU8wXzEyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg1OiBHUElPMCBQaW4gMTIgSGFuZGxlciAqLworICBHUElPMF8xM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4NjogR1BJTzAgUGluIDEzIEhhbmRsZXIgKi8KKyAgR1BJTzBfMTRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODc6IEdQSU8wIFBpbiAxNCBIYW5kbGVyICovCisgIEdQSU8wXzE1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg4OiBHUElPMCBQaW4gMTUgSGFuZGxlciAqLworICBHUElPMV8wX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA4OTogR1BJTzEgUGluIDAgSGFuZGxlciAqLworICBHUElPMV8xX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5MDogR1BJTzEgUGluIDEgSGFuZGxlciAqLworICBHUElPMV8yX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5MTogR1BJTzEgUGluIDIgSGFuZGxlciAqLworICBHUElPMV8zX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5MjogR1BJTzEgUGluIDMgSGFuZGxlciAqLworICBHUElPMV80X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5MzogR1BJTzEgUGluIDQgSGFuZGxlciAqLworICBHUElPMV81X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5NDogR1BJTzEgUGluIDUgSGFuZGxlciAqLworICBHUElPMV82X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5NTogR1BJTzEgUGluIDYgSGFuZGxlciAqLworICBHUElPMV83X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5NjogR1BJTzEgUGluIDcgSGFuZGxlciAqLworICBHUElPMV84X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5NzogR1BJTzEgUGluIDggSGFuZGxlciAqLworICBHUElPMV85X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA5ODogR1BJTzEgUGluIDkgSGFuZGxlciAqLworICBHUElPMV8xMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA5OTogR1BJTzEgUGluIDEwIEhhbmRsZXIgKi8KKyAgR1BJTzFfMTFfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTAwOiBHUElPMSBQaW4gMTEgSGFuZGxlciAqLworICBHUElPMV8xMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMDE6IEdQSU8xIFBpbiAxMiBIYW5kbGVyICovCisgIEdQSU8xXzEzX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEwMjogR1BJTzEgUGluIDEzIEhhbmRsZXIgKi8KKyAgR1BJTzFfMTRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTAzOiBHUElPMSBQaW4gMTQgSGFuZGxlciAqLworICBHUElPMV8xNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMDQ6IEdQSU8xIFBpbiAxNSBIYW5kbGVyICovCisgIEdQSU8yXzBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEwNTogR1BJTzIgUGluIDAgSGFuZGxlciAqLworICBHUElPMl8xX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDY6IEdQSU8yIFBpbiAxIEhhbmRsZXIgKi8KKyAgR1BJTzJfMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTA3OiBHUElPMiBQaW4gMiBIYW5kbGVyICovCisgIEdQSU8yXzNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEwODogR1BJTzIgUGluIDMgSGFuZGxlciAqLworICBHUElPMl80X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDk6IEdQSU8yIFBpbiA0IEhhbmRsZXIgKi8KKyAgR1BJTzJfNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTEwOiBHUElPMiBQaW4gNSBIYW5kbGVyICovCisgIEdQSU8yXzZfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExMTogR1BJTzIgUGluIDYgSGFuZGxlciAqLworICBHUElPMl83X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMTI6IEdQSU8yIFBpbiA3IEhhbmRsZXIgKi8KKyAgR1BJTzJfOF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTEzOiBHUElPMiBQaW4gOCBIYW5kbGVyICovCisgIEdQSU8yXzlfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExNDogR1BJTzIgUGluIDkgSGFuZGxlciAqLworICBHUElPMl8xMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTU6IEdQSU8yIFBpbiAxMCBIYW5kbGVyICovCisgIEdQSU8yXzExX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDExNjogR1BJTzIgUGluIDExIEhhbmRsZXIgKi8KKyAgR1BJTzJfMTJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTE3OiBHUElPMiBQaW4gMTIgSGFuZGxlciAqLworICBHUElPMl8xM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTg6IEdQSU8yIFBpbiAxMyBIYW5kbGVyICovCisgIEdQSU8yXzE0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDExOTogR1BJTzIgUGluIDE0IEhhbmRsZXIgKi8KKyAgR1BJTzJfMTVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTIwOiBHUElPMiBQaW4gMTUgSGFuZGxlciAqLworICBHUElPM18wX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjE6IEdQSU8zIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzNfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTIyOiBHUElPMyBQaW4gMSBIYW5kbGVyICovCisgIEdQSU8zXzJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyMzogR1BJTzMgUGluIDIgSGFuZGxlciAqLworICBHUElPM18zX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjQ6IEdQSU8zIFBpbiAzIEhhbmRsZXIgKi8KKyAgVUFSVFJYNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTI1OiBVQVJUIDUgUlggSW50ZXJydXB0ICovCisgIFVBUlRUWDVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyNjogVUFSVCA1IFRYIEludGVycnVwdCAqLworICBVQVJUNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgIC8qICAxMjc6IFVBUlQgNSBjb21iaW5lZCBJbnRlcnJ1cHQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTI4OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMjk6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEzMDogUmVzZXJ2ZWQgKi8KK307CisKKyNpZiBkZWZpbmVkICggX19HTlVDX18gKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgUmVzZXQgSGFuZGxlciBjYWxsZWQgb24gY29udHJvbGxlciByZXNldAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgUmVzZXRfSGFuZGxlcih2b2lkKQoreworICBfX3NldF9NU1BMSU0oKHVpbnQzMl90KSgmX19TVEFDS19MSU1JVCkpOworCisgIFN5c3RlbUluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENNU0lTIFN5c3RlbSBJbml0aWFsaXphdGlvbiAqLworICBfX1BST0dSQU1fU1RBUlQoKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbnRlciBQcmVNYWluIChDIGxpYnJhcnkgZW50cnkgcG9pbnQpICovCit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9zdGFydHVwX2NvcnN0b25lX3BvbGFyaXNfbnMuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmU4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9zdGFydHVwX2NvcnN0b25lX3BvbGFyaXNfbnMuYwpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmF0aXZlIG9mIENNU0lTIFY1LjYuMCBzdGFydHVwX0FSTXY4MU1NTC5jCisgKiBHaXQgU0hBOiBiNWYwNjAzZDZhNTg0ZDE3MjRkOTUyZmQ4YjA3Mzc0NThiOTBkNjJiCisgKi8KKworI2luY2x1ZGUgImNtc2lzLmgiCisjaW5jbHVkZSAicmVnaW9uLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeGNlcHRpb24gLyBJbnRlcnJ1cHQgSGFuZGxlciBGdW5jdGlvbiBQcm90b3R5cGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHZvaWQoICpwRnVuYyApKCB2b2lkICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeHRlcm5hbCBSZWZlcmVuY2VzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIF9fTVNQX0lOSVRJQUxfU1AgICAgICAgICAgICAgIFJFR0lPTl9OQU1FKEltYWdlJCQsIEFSTV9MSUJfU1RBQ0tfTVNQLCAkJFpJJCRMaW1pdCkKKyNkZWZpbmUgX19NU1BfU1RBQ0tfTElNSVQgICAgICAgICAgICAgUkVHSU9OX05BTUUoSW1hZ2UkJCwgQVJNX0xJQl9TVEFDS19NU1AsICQkWkkkJEJhc2UpCisKK2V4dGVybiB1aW50MzJfdCBfX01TUF9JTklUSUFMX1NQOworZXh0ZXJuIHVpbnQzMl90IF9fTVNQX1NUQUNLX0xJTUlUOworCitleHRlcm4gdWludDMyX3QgX19JTklUSUFMX1NQOworZXh0ZXJuIHVpbnQzMl90IF9fU1RBQ0tfTElNSVQ7CisKK2V4dGVybiB2b2lkIF9fUFJPR1JBTV9TVEFSVCh2b2lkKSBfX05PX1JFVFVSTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEludGVybmFsIFJlZmVyZW5jZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJlc2V0X0hhbmRsZXIgICh2b2lkKSBfX05PX1JFVFVSTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV4Y2VwdGlvbiAvIEludGVycnVwdCBIYW5kbGVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBERUZBVUxUX0lSUV9IQU5ETEVSKGhhbmRsZXJfbmFtZSkgIFwKK3ZvaWQgX19XRUFLIGhhbmRsZXJfbmFtZSh2b2lkKSBfX05PX1JFVFVSTjsgXAordm9pZCBoYW5kbGVyX25hbWUodm9pZCkgeyBcCisgICAgd2hpbGUoMSk7IFwKK30KKworLyogRXhjZXB0aW9ucyAqLworREVGQVVMVF9JUlFfSEFORExFUihOTUlfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoSGFyZEZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE1lbU1hbmFnZV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihCdXNGYXVsdF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVc2FnZUZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNlY3VyZUZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNWQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihEZWJ1Z01vbl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihQZW5kU1ZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoU3lzVGlja19IYW5kbGVyKQorCitERUZBVUxUX0lSUV9IQU5ETEVSKE5PTlNFQ19XQVRDSERPR19SRVNFVF9SRVFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoTk9OU0VDX1dBVENIRE9HX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNMT1dDTEtfVGltZXJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVEZNX1RJTUVSMF9JUlFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVElNRVIxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRJTUVSMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihNUENfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoUFBDX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE1TQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihCUklER0VfRVJST1JfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQ09NQklORURfUFBVX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKERFQlVHX1BQVV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihUSU1FUjNfQU9OX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKENQVTBfQ1RJXzBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQ1BVMF9DVElfMV9IYW5kbGVyKQorCitERUZBVUxUX0lSUV9IQU5ETEVSKFN5c3RlbV9UaW1lc3RhbXBfQ291bnRlcl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlgwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFJYMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUVFgxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRSWDJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFRYMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlgzX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFJYNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUVFg0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQwX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQxX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQyX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQzX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQ0X0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRPVkZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoRVRIRVJORVRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoSTJTX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRPVUNIX1NDUkVFTl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVU0JfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoU1BJX0FEQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTUElfU0hJRUxEMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTUElfU0hJRUxEMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihFVEhPU19VNTVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF80X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfNl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF83X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzhfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfOV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV8wX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV8zX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV82X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzdfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfOF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV85X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzExX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEzX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzE0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzE1X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8yX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl81X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfN19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl84X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzlfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPM18xX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8zXzJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlg1X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDVfSGFuZGxlcikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV4Y2VwdGlvbiAvIEludGVycnVwdCBWZWN0b3IgdGFibGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkICggX19HTlVDX18gKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGVkYW50aWMiCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHBGdW5jIF9fVkVDVE9SX1RBQkxFWzQ5Nl07CisgICAgICAgY29uc3QgcEZ1bmMgX19WRUNUT1JfVEFCTEVbNDk2XSBfX1ZFQ1RPUl9UQUJMRV9BVFRSSUJVVEUgPSB7CisgIChwRnVuYykoJl9fTVNQX0lOSVRJQUxfU1ApLCAgICAgICAgLyogICAgICBJbml0aWFsIFN0YWNrIFBvaW50ZXIgKi8KKyAgUmVzZXRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2V0IEhhbmRsZXIgKi8KKyAgTk1JX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAtMTQ6IE5NSSBIYW5kbGVyICovCisgIEhhcmRGYXVsdF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgLyogLTEzOiBIYXJkIEZhdWx0IEhhbmRsZXIgKi8KKyAgTWVtTWFuYWdlX0hhbmRsZXIsICAgICAgICAgICAgICAgICAvKiAtMTI6IE1QVSBGYXVsdCBIYW5kbGVyICovCisgIEJ1c0ZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogLTExOiBCdXMgRmF1bHQgSGFuZGxlciAqLworICBVc2FnZUZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qIC0xMDogVXNhZ2UgRmF1bHQgSGFuZGxlciAqLworICBTZWN1cmVGYXVsdF9IYW5kbGVyLCAgICAgICAgICAgICAgIC8qICAtOTogU2VjdXJlIEZhdWx0IEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVzZXJ2ZWQgKi8KKyAgU1ZDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgLTU6IFNWQ2FsbCBIYW5kbGVyICovCisgIERlYnVnTW9uX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIC00OiBEZWJ1ZyBNb25pdG9yIEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2VydmVkICovCisgIFBlbmRTVl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgLyogIC0yOiBQZW5kU1YgSGFuZGxlciAqLworICBTeXNUaWNrX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAtMTogU3lzVGljayBIYW5kbGVyICovCisKKyAgTk9OU0VDX1dBVENIRE9HX1JFU0VUX1JFUV9IYW5kbGVyLCAvKiAgIDA6IE5vbi1TZWN1cmUgV2F0Y2hkb2cgUmVzZXQgUmVxdWVzdCBIYW5kbGVyICovCisgIE5PTlNFQ19XQVRDSERPR19IYW5kbGVyLCAgICAgICAgICAgLyogICAxOiBOb24tU2VjdXJlIFdhdGNoZG9nIEhhbmRsZXIgKi8KKyAgU0xPV0NMS19UaW1lcl9IYW5kbGVyLCAgICAgICAgICAgICAvKiAgIDI6IFNMT1dDTEsgVGltZXIgSGFuZGxlciAqLworICBURk1fVElNRVIwX0lSUV9IYW5kbGVyLCAgICAgICAgICAgIC8qICAgMzogVElNRVIgMCBIYW5kbGVyICovCisgIFRJTUVSMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgLyogICA0OiBUSU1FUiAxIEhhbmRsZXIgKi8KKyAgVElNRVIyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAvKiAgIDU6IFRJTUVSIDIgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgNjogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDc6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICA4OiBSZXNlcnZlZCAqLworICBNUENfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICAgOTogTVBDIENvbWJpbmVkIChTZWN1cmUpIEhhbmRsZXIgKi8KKyAgUFBDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTA6IFBQQyBDb21iaW5lZCAoU2VjdXJlKSBIYW5kbGVyICovCisgIE1TQ19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDExOiBNU0MgQ29tYmluZWQgKFNlY3VyZSkgSGFuZGxlciAqLworICBCUklER0VfRVJST1JfSGFuZGxlciwgICAgICAgICAgICAgIC8qICAxMjogQnJpZGdlIEVycm9yIChTZWN1cmUpIEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTM6IFJlc2VydmVkICovCisgIENPTUJJTkVEX1BQVV9IYW5kbGVyLCAgICAgICAgICAgICAgLyogIDE0OiBDb21iaW5lZCBQUFUgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxNTogUmVzZXJ2ZWQgKi8KKyAgRVRIT1NfVTU1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAvKiAgMTY6IEV0aG9zLVU1NSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDE3OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxODogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTk6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIwOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyMTogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjI6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIzOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyNDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjU6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDI2OiBSZXNlcnZlZCAqLworICBUSU1FUjNfQU9OX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyNzogVElNRVIgMyBBT04gSGFuZGxlciAqLworICBDUFUwX0NUSV8wX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyODogQ1BVMCBDVEkgSVJRIDAgSGFuZGxlciAqLworICBDUFUwX0NUSV8xX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyOTogQ1BVMCBDVEkgSVJRIDEgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzMDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMzE6IFJlc2VydmVkICovCisKKyAgLyogRXh0ZXJuYWwgaW50ZXJydXB0cyAqLworICBTeXN0ZW1fVGltZXN0YW1wX0NvdW50ZXJfSGFuZGxlciwgIC8qICAzMjogU3lzdGVtIHRpbWVzdGFtcCBjb3VudGVyIEhhbmRsZXIgKi8KKyAgVUFSVFJYMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzM6IFVBUlQgMCBSWCBIYW5kbGVyICovCisgIFVBUlRUWDBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM0OiBVQVJUIDAgVFggSGFuZGxlciAqLworICBVQVJUUlgxX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzNTogVUFSVCAxIFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzY6IFVBUlQgMSBUWCBIYW5kbGVyICovCisgIFVBUlRSWDJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM3OiBVQVJUIDIgUlggSGFuZGxlciAqLworICBVQVJUVFgyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzODogVUFSVCAyIFRYIEhhbmRsZXIgKi8KKyAgVUFSVFJYM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzk6IFVBUlQgMyBSWCBIYW5kbGVyICovCisgIFVBUlRUWDNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDQwOiBVQVJUIDMgVFggSGFuZGxlciAqLworICBVQVJUUlg0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA0MTogVUFSVCA0IFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNDI6IFVBUlQgNCBUWCBIYW5kbGVyICovCisgIFVBUlQwX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQzOiBVQVJUIDAgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUMV9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA0NDogVUFSVCAxIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgVUFSVDJfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNDU6IFVBUlQgMiBDb21iaW5lZCBIYW5kbGVyICovCisgIFVBUlQzX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQ2OiBVQVJUIDMgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUNF9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA0NzogVUFSVCA0IENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgVUFSVE9WRl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNDg6IFVBUlQgMCwgMSwgMiwgMywgNCAmIDUgT3ZlcmZsb3cgSGFuZGxlciAqLworICBFVEhFUk5FVF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA0OTogRXRoZXJuZXQgSGFuZGxlciAqLworICBJMlNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICA1MDogQXVkaW8gSTJTIEhhbmRsZXIgKi8KKyAgVE9VQ0hfU0NSRUVOX0hhbmRsZXIsICAgICAgICAgICAgICAvKiAgNTE6IFRvdWNoIFNjcmVlbiBIYW5kbGVyICovCisgIFVTQl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDUyOiBVU0IgSGFuZGxlciAqLworICBTUElfQURDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA1MzogU1BJIEFEQyBIYW5kbGVyICovCisgIFNQSV9TSElFTEQwX0hhbmRsZXIsICAgICAgICAgICAgICAgLyogIDU0OiBTUEkgKFNoaWVsZCAwKSBIYW5kbGVyICovCisgIFNQSV9TSElFTEQxX0hhbmRsZXIsICAgICAgICAgICAgICAgLyogIDU1OiBTUEkgKFNoaWVsZCAwKSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDU2OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1NzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNTg6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDU5OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2MDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjE6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDYyOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2MzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjQ6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDY1OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2NjogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjc6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDY4OiBSZXNlcnZlZCAqLworICBHUElPMF9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA2OTogR1BJTyAwIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgR1BJTzFfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNzA6IEdQSU8gMSBDb21iaW5lZCBIYW5kbGVyICovCisgIEdQSU8yX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDcxOiBHUElPIDIgQ29tYmluZWQgSGFuZGxlciAqLworICBHUElPM19Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA3MjogR1BJTyAzIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgR1BJTzBfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzM6IEdQSU8wIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzBfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzQ6IEdQSU8wIFBpbiAxIEhhbmRsZXIgKi8KKyAgR1BJTzBfMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzU6IEdQSU8wIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzBfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzY6IEdQSU8wIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzBfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzc6IEdQSU8wIFBpbiA0IEhhbmRsZXIgKi8KKyAgR1BJTzBfNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzg6IEdQSU8wIFBpbiA1IEhhbmRsZXIgKi8KKyAgR1BJTzBfNl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzk6IEdQSU8wIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzBfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODA6IEdQSU8wIFBpbiA3IEhhbmRsZXIgKi8KKyAgR1BJTzBfOF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODE6IEdQSU8wIFBpbiA4IEhhbmRsZXIgKi8KKyAgR1BJTzBfOV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODI6IEdQSU8wIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzBfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODM6IEdQSU8wIFBpbiAxMCBIYW5kbGVyICovCisgIEdQSU8wXzExX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg0OiBHUElPMCBQaW4gMTEgSGFuZGxlciAqLworICBHUElPMF8xMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4NTogR1BJTzAgUGluIDEyIEhhbmRsZXIgKi8KKyAgR1BJTzBfMTNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODY6IEdQSU8wIFBpbiAxMyBIYW5kbGVyICovCisgIEdQSU8wXzE0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg3OiBHUElPMCBQaW4gMTQgSGFuZGxlciAqLworICBHUElPMF8xNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4ODogR1BJTzAgUGluIDE1IEhhbmRsZXIgKi8KKyAgR1BJTzFfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODk6IEdQSU8xIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzFfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTA6IEdQSU8xIFBpbiAxIEhhbmRsZXIgKi8KKyAgR1BJTzFfMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTE6IEdQSU8xIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzFfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTI6IEdQSU8xIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzFfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTM6IEdQSU8xIFBpbiA0IEhhbmRsZXIgKi8KKyAgR1BJTzFfNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTQ6IEdQSU8xIFBpbiA1IEhhbmRsZXIgKi8KKyAgR1BJTzFfNl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTU6IEdQSU8xIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzFfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTY6IEdQSU8xIFBpbiA3IEhhbmRsZXIgKi8KKyAgR1BJTzFfOF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTc6IEdQSU8xIFBpbiA4IEhhbmRsZXIgKi8KKyAgR1BJTzFfOV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTg6IEdQSU8xIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzFfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgOTk6IEdQSU8xIFBpbiAxMCBIYW5kbGVyICovCisgIEdQSU8xXzExX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEwMDogR1BJTzEgUGluIDExIEhhbmRsZXIgKi8KKyAgR1BJTzFfMTJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTAxOiBHUElPMSBQaW4gMTIgSGFuZGxlciAqLworICBHUElPMV8xM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMDI6IEdQSU8xIFBpbiAxMyBIYW5kbGVyICovCisgIEdQSU8xXzE0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEwMzogR1BJTzEgUGluIDE0IEhhbmRsZXIgKi8KKyAgR1BJTzFfMTVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTA0OiBHUElPMSBQaW4gMTUgSGFuZGxlciAqLworICBHUElPMl8wX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDU6IEdQSU8yIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzJfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTA2OiBHUElPMiBQaW4gMSBIYW5kbGVyICovCisgIEdQSU8yXzJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEwNzogR1BJTzIgUGluIDIgSGFuZGxlciAqLworICBHUElPMl8zX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDg6IEdQSU8yIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzJfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTA5OiBHUElPMiBQaW4gNCBIYW5kbGVyICovCisgIEdQSU8yXzVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExMDogR1BJTzIgUGluIDUgSGFuZGxlciAqLworICBHUElPMl82X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMTE6IEdQSU8yIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzJfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTEyOiBHUElPMiBQaW4gNyBIYW5kbGVyICovCisgIEdQSU8yXzhfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExMzogR1BJTzIgUGluIDggSGFuZGxlciAqLworICBHUElPMl85X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMTQ6IEdQSU8yIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzJfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTE1OiBHUElPMiBQaW4gMTAgSGFuZGxlciAqLworICBHUElPMl8xMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTY6IEdQSU8yIFBpbiAxMSBIYW5kbGVyICovCisgIEdQSU8yXzEyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDExNzogR1BJTzIgUGluIDEyIEhhbmRsZXIgKi8KKyAgR1BJTzJfMTNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTE4OiBHUElPMiBQaW4gMTMgSGFuZGxlciAqLworICBHUElPMl8xNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTk6IEdQSU8yIFBpbiAxNCBIYW5kbGVyICovCisgIEdQSU8yXzE1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEyMDogR1BJTzIgUGluIDE1IEhhbmRsZXIgKi8KKyAgR1BJTzNfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTIxOiBHUElPMyBQaW4gMCBIYW5kbGVyICovCisgIEdQSU8zXzFfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyMjogR1BJTzMgUGluIDEgSGFuZGxlciAqLworICBHUElPM18yX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjM6IEdQSU8zIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzNfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTI0OiBHUElPMyBQaW4gMyBIYW5kbGVyICovCisgIFVBUlRSWDVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyNTogVUFSVCA1IFJYIEludGVycnVwdCAqLworICBVQVJUVFg1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjY6IFVBUlQgNSBUWCBJbnRlcnJ1cHQgKi8KKyAgVUFSVDVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAvKiAgMTI3OiBVQVJUIDUgY29tYmluZWQgSW50ZXJydXB0ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEyODogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTI5OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMzA6IFJlc2VydmVkICovCit9OworCisjaWYgZGVmaW5lZCAoIF9fR05VQ19fICkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJlc2V0IEhhbmRsZXIgY2FsbGVkIG9uIGNvbnRyb2xsZXIgcmVzZXQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJlc2V0X0hhbmRsZXIodm9pZCkKK3sKKyAgX19zZXRfTVNQTElNKCh1aW50MzJfdCkoJl9fTVNQX1NUQUNLX0xJTUlUKSk7CisKKyAgU3lzdGVtSW5pdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ01TSVMgU3lzdGVtIEluaXRpYWxpemF0aW9uICovCisgIF9fQVNNIHZvbGF0aWxlKCJNUlMgICAgIFIwLCBjb250cm9sXG4iICAgIC8qIEdldCBjb250cm9sIHZhbHVlICovCisgICAgICAgICAgICAgICAgICJPUlIgICAgIFIwLCBSMCwgIzJcbiIgICAgIC8qIFNlbGVjdCBzd2l0Y2ggdG8gUFNQICovCisgICAgICAgICAgICAgICAgICJNU1IgICAgIGNvbnRyb2wsIFIwXG4iICAgIC8qIExvYWQgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgOiAicjAiKTsKKyAgX19QUk9HUkFNX1NUQVJUKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW50ZXIgUHJlTWFpbiAoQyBsaWJyYXJ5IGVudHJ5IHBvaW50KSAqLworfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2Uvc3RhcnR1cF9jb3JzdG9uZV9wb2xhcmlzX3MuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2NTM2YgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9kZXZpY2Uvc291cmNlL3N0YXJ0dXBfY29yc3RvbmVfcG9sYXJpc19zLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTsgeW91IG1heQorICogbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIHd3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgZGVyaXZhdGl2ZSBvZiBDTVNJUyBWNS42LjAgc3RhcnR1cF9BUk12ODFNTUwuYworICogR2l0IFNIQTogYjVmMDYwM2Q2YTU4NGQxNzI0ZDk1MmZkOGIwNzM3NDU4YjkwZDYyYgorICovCisKKyNpbmNsdWRlICJjbXNpcy5oIgorI2luY2x1ZGUgInJlZ2lvbi5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRXhjZXB0aW9uIC8gSW50ZXJydXB0IEhhbmRsZXIgRnVuY3Rpb24gUHJvdG90eXBlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiB2b2lkKCAqcEZ1bmMgKSggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRXh0ZXJuYWwgUmVmZXJlbmNlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBfX01TUF9JTklUSUFMX1NQICAgICAgICAgICAgICBSRUdJT05fTkFNRShJbWFnZSQkLCBBUk1fTElCX1NUQUNLLCAkJFpJJCRMaW1pdCkKKyNkZWZpbmUgX19NU1BfU1RBQ0tfTElNSVQgICAgICAgICAgICAgUkVHSU9OX05BTUUoSW1hZ2UkJCwgQVJNX0xJQl9TVEFDSywgJCRaSSQkQmFzZSkKKworZXh0ZXJuIHVpbnQzMl90IF9fTVNQX0lOSVRJQUxfU1A7CitleHRlcm4gdWludDMyX3QgX19NU1BfU1RBQ0tfTElNSVQ7CisKK2V4dGVybiB2b2lkIF9fUFJPR1JBTV9TVEFSVCh2b2lkKSBfX05PX1JFVFVSTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEludGVybmFsIFJlZmVyZW5jZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJlc2V0X0hhbmRsZXIgICh2b2lkKSBfX05PX1JFVFVSTjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV4Y2VwdGlvbiAvIEludGVycnVwdCBIYW5kbGVyCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBERUZBVUxUX0lSUV9IQU5ETEVSKGhhbmRsZXJfbmFtZSkgIFwKK3ZvaWQgX19XRUFLIGhhbmRsZXJfbmFtZSh2b2lkKSBfX05PX1JFVFVSTjsgXAordm9pZCBoYW5kbGVyX25hbWUodm9pZCkgeyBcCisgICAgd2hpbGUoMSk7IFwKK30KKworLyogRXhjZXB0aW9ucyAqLworREVGQVVMVF9JUlFfSEFORExFUihOTUlfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoSGFyZEZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE1lbU1hbmFnZV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihCdXNGYXVsdF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVc2FnZUZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNlY3VyZUZhdWx0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNWQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihEZWJ1Z01vbl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihQZW5kU1ZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoU3lzVGlja19IYW5kbGVyKQorCitERUZBVUxUX0lSUV9IQU5ETEVSKE5PTlNFQ19XQVRDSERPR19SRVNFVF9SRVFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoTk9OU0VDX1dBVENIRE9HX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFNMT1dDTEtfVGltZXJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVEZNX1RJTUVSMF9JUlFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVElNRVIxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRJTUVSMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihNUENfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoUFBDX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKE1TQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihCUklER0VfRVJST1JfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQ09NQklORURfUFBVX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKERFQlVHX1BQVV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihUSU1FUjNfQU9OX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKENQVTBfQ1RJXzBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoQ1BVMF9DVElfMV9IYW5kbGVyKQorCitERUZBVUxUX0lSUV9IQU5ETEVSKFN5c3RlbV9UaW1lc3RhbXBfQ291bnRlcl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlgwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFJYMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUVFgxX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRSWDJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFRYMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlgzX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVFJYNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUVFg0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQwX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQxX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQyX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQzX0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlQ0X0NvbWJpbmVkX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRPVkZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoRVRIRVJORVRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoSTJTX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFRPVUNIX1NDUkVFTl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVU0JfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoU1BJX0FEQ19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTUElfU0hJRUxEMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihTUElfU0hJRUxEMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihFVEhPU19VNTVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfQ29tYmluZWRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF80X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfNl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF83X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8wXzhfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzBfOV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMF8xNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV8wX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfMl9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV8zX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfNV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV82X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzdfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzFfOF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMV85X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEwX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzExX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEyX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzEzX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzE0X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8xXzE1X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMV9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl8yX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfNF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl81X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzZfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfN19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPMl84X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8yXzlfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTBfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTFfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTNfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTRfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzJfMTVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfMF9IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihHUElPM18xX0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKEdQSU8zXzJfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoR1BJTzNfM19IYW5kbGVyKQorREVGQVVMVF9JUlFfSEFORExFUihVQVJUUlg1X0hhbmRsZXIpCitERUZBVUxUX0lSUV9IQU5ETEVSKFVBUlRUWDVfSGFuZGxlcikKK0RFRkFVTFRfSVJRX0hBTkRMRVIoVUFSVDVfSGFuZGxlcikKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEV4Y2VwdGlvbiAvIEludGVycnVwdCBWZWN0b3IgdGFibGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkICggX19HTlVDX18gKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGVkYW50aWMiCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHBGdW5jIF9fVkVDVE9SX1RBQkxFWzQ5Nl07CisgICAgICAgY29uc3QgcEZ1bmMgX19WRUNUT1JfVEFCTEVbNDk2XSBfX1ZFQ1RPUl9UQUJMRV9BVFRSSUJVVEUgPSB7CisgIChwRnVuYykoJl9fTVNQX0lOSVRJQUxfU1ApLCAgICAgICAgLyogICAgICBJbml0aWFsIFN0YWNrIFBvaW50ZXIgKi8KKyAgUmVzZXRfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2V0IEhhbmRsZXIgKi8KKyAgTk1JX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAtMTQ6IE5NSSBIYW5kbGVyICovCisgIEhhcmRGYXVsdF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgLyogLTEzOiBIYXJkIEZhdWx0IEhhbmRsZXIgKi8KKyAgTWVtTWFuYWdlX0hhbmRsZXIsICAgICAgICAgICAgICAgICAvKiAtMTI6IE1QVSBGYXVsdCBIYW5kbGVyICovCisgIEJ1c0ZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogLTExOiBCdXMgRmF1bHQgSGFuZGxlciAqLworICBVc2FnZUZhdWx0X0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qIC0xMDogVXNhZ2UgRmF1bHQgSGFuZGxlciAqLworICBTZWN1cmVGYXVsdF9IYW5kbGVyLCAgICAgICAgICAgICAgIC8qICAtOTogU2VjdXJlIEZhdWx0IEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVzZXJ2ZWQgKi8KKyAgU1ZDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgLTU6IFNWQ2FsbCBIYW5kbGVyICovCisgIERlYnVnTW9uX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIC00OiBEZWJ1ZyBNb25pdG9yIEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlc2VydmVkICovCisgIFBlbmRTVl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgLyogIC0yOiBQZW5kU1YgSGFuZGxlciAqLworICBTeXNUaWNrX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAtMTogU3lzVGljayBIYW5kbGVyICovCisKKyAgTk9OU0VDX1dBVENIRE9HX1JFU0VUX1JFUV9IYW5kbGVyLCAvKiAgIDA6IE5vbi1TZWN1cmUgV2F0Y2hkb2cgUmVzZXQgUmVxdWVzdCBIYW5kbGVyICovCisgIE5PTlNFQ19XQVRDSERPR19IYW5kbGVyLCAgICAgICAgICAgLyogICAxOiBOb24tU2VjdXJlIFdhdGNoZG9nIEhhbmRsZXIgKi8KKyAgU0xPV0NMS19UaW1lcl9IYW5kbGVyLCAgICAgICAgICAgICAvKiAgIDI6IFNMT1dDTEsgVGltZXIgSGFuZGxlciAqLworICBURk1fVElNRVIwX0lSUV9IYW5kbGVyLCAgICAgICAgICAgIC8qICAgMzogVElNRVIgMCBIYW5kbGVyICovCisgIFRJTUVSMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgLyogICA0OiBUSU1FUiAxIEhhbmRsZXIgKi8KKyAgVElNRVIyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAvKiAgIDU6IFRJTUVSIDIgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgNjogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDc6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICA4OiBSZXNlcnZlZCAqLworICBNUENfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICAgOTogTVBDIENvbWJpbmVkIChTZWN1cmUpIEhhbmRsZXIgKi8KKyAgUFBDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTA6IFBQQyBDb21iaW5lZCAoU2VjdXJlKSBIYW5kbGVyICovCisgIE1TQ19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDExOiBNU0MgQ29tYmluZWQgKFNlY3VyZSkgSGFuZGxlciAqLworICBCUklER0VfRVJST1JfSGFuZGxlciwgICAgICAgICAgICAgIC8qICAxMjogQnJpZGdlIEVycm9yIChTZWN1cmUpIEhhbmRsZXIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTM6IFJlc2VydmVkICovCisgIENPTUJJTkVEX1BQVV9IYW5kbGVyLCAgICAgICAgICAgICAgLyogIDE0OiBDb21iaW5lZCBQUFUgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxNTogUmVzZXJ2ZWQgKi8KKyAgRVRIT1NfVTU1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAvKiAgMTY6IEV0aG9zLVU1NSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDE3OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxODogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTk6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIwOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyMTogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjI6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDIzOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAyNDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMjU6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDI2OiBSZXNlcnZlZCAqLworICBUSU1FUjNfQU9OX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyNzogVElNRVIgMyBBT04gSGFuZGxlciAqLworICBDUFUwX0NUSV8wX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyODogQ1BVMCBDVEkgSVJRIDAgSGFuZGxlciAqLworICBDUFUwX0NUSV8xX0hhbmRsZXIsICAgICAgICAgICAgICAgIC8qICAyOTogQ1BVMCBDVEkgSVJRIDEgSGFuZGxlciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAzMDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMzE6IFJlc2VydmVkICovCisKKyAgLyogRXh0ZXJuYWwgaW50ZXJydXB0cyAqLworICBTeXN0ZW1fVGltZXN0YW1wX0NvdW50ZXJfSGFuZGxlciwgIC8qICAzMjogU3lzdGVtIHRpbWVzdGFtcCBjb3VudGVyIEhhbmRsZXIgKi8KKyAgVUFSVFJYMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzM6IFVBUlQgMCBSWCBIYW5kbGVyICovCisgIFVBUlRUWDBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM0OiBVQVJUIDAgVFggSGFuZGxlciAqLworICBVQVJUUlgxX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzNTogVUFSVCAxIFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzY6IFVBUlQgMSBUWCBIYW5kbGVyICovCisgIFVBUlRSWDJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDM3OiBVQVJUIDIgUlggSGFuZGxlciAqLworICBVQVJUVFgyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAzODogVUFSVCAyIFRYIEhhbmRsZXIgKi8KKyAgVUFSVFJYM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMzk6IFVBUlQgMyBSWCBIYW5kbGVyICovCisgIFVBUlRUWDNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDQwOiBVQVJUIDMgVFggSGFuZGxlciAqLworICBVQVJUUlg0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA0MTogVUFSVCA0IFJYIEhhbmRsZXIgKi8KKyAgVUFSVFRYNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNDI6IFVBUlQgNCBUWCBIYW5kbGVyICovCisgIFVBUlQwX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQzOiBVQVJUIDAgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUMV9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA0NDogVUFSVCAxIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgVUFSVDJfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNDU6IFVBUlQgMiBDb21iaW5lZCBIYW5kbGVyICovCisgIFVBUlQzX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDQ2OiBVQVJUIDMgQ29tYmluZWQgSGFuZGxlciAqLworICBVQVJUNF9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA0NzogVUFSVCA0IENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgVUFSVE9WRl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNDg6IFVBUlQgMCwgMSwgMiwgMywgNCAmIDUgT3ZlcmZsb3cgSGFuZGxlciAqLworICBFVEhFUk5FVF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA0OTogRXRoZXJuZXQgSGFuZGxlciAqLworICBJMlNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAgIC8qICA1MDogQXVkaW8gSTJTIEhhbmRsZXIgKi8KKyAgVE9VQ0hfU0NSRUVOX0hhbmRsZXIsICAgICAgICAgICAgICAvKiAgNTE6IFRvdWNoIFNjcmVlbiBIYW5kbGVyICovCisgIFVTQl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAgICAgLyogIDUyOiBVU0IgSGFuZGxlciAqLworICBTUElfQURDX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICA1MzogU1BJIEFEQyBIYW5kbGVyICovCisgIFNQSV9TSElFTEQwX0hhbmRsZXIsICAgICAgICAgICAgICAgLyogIDU0OiBTUEkgKFNoaWVsZCAwKSBIYW5kbGVyICovCisgIFNQSV9TSElFTEQxX0hhbmRsZXIsICAgICAgICAgICAgICAgLyogIDU1OiBTUEkgKFNoaWVsZCAwKSBIYW5kbGVyICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDU2OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA1NzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNTg6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDU5OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2MDogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjE6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDYyOiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2MzogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjQ6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDY1OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICA2NjogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgNjc6IFJlc2VydmVkICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDY4OiBSZXNlcnZlZCAqLworICBHUElPMF9Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA2OTogR1BJTyAwIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgR1BJTzFfQ29tYmluZWRfSGFuZGxlciwgICAgICAgICAgICAvKiAgNzA6IEdQSU8gMSBDb21iaW5lZCBIYW5kbGVyICovCisgIEdQSU8yX0NvbWJpbmVkX0hhbmRsZXIsICAgICAgICAgICAgLyogIDcxOiBHUElPIDIgQ29tYmluZWQgSGFuZGxlciAqLworICBHUElPM19Db21iaW5lZF9IYW5kbGVyLCAgICAgICAgICAgIC8qICA3MjogR1BJTyAzIENvbWJpbmVkIEhhbmRsZXIgKi8KKyAgR1BJTzBfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzM6IEdQSU8wIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzBfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzQ6IEdQSU8wIFBpbiAxIEhhbmRsZXIgKi8KKyAgR1BJTzBfMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzU6IEdQSU8wIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzBfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzY6IEdQSU8wIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzBfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzc6IEdQSU8wIFBpbiA0IEhhbmRsZXIgKi8KKyAgR1BJTzBfNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzg6IEdQSU8wIFBpbiA1IEhhbmRsZXIgKi8KKyAgR1BJTzBfNl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgNzk6IEdQSU8wIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzBfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODA6IEdQSU8wIFBpbiA3IEhhbmRsZXIgKi8KKyAgR1BJTzBfOF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODE6IEdQSU8wIFBpbiA4IEhhbmRsZXIgKi8KKyAgR1BJTzBfOV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODI6IEdQSU8wIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzBfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODM6IEdQSU8wIFBpbiAxMCBIYW5kbGVyICovCisgIEdQSU8wXzExX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg0OiBHUElPMCBQaW4gMTEgSGFuZGxlciAqLworICBHUElPMF8xMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4NTogR1BJTzAgUGluIDEyIEhhbmRsZXIgKi8KKyAgR1BJTzBfMTNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgODY6IEdQSU8wIFBpbiAxMyBIYW5kbGVyICovCisgIEdQSU8wXzE0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDg3OiBHUElPMCBQaW4gMTQgSGFuZGxlciAqLworICBHUElPMF8xNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICA4ODogR1BJTzAgUGluIDE1IEhhbmRsZXIgKi8KKyAgR1BJTzFfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgODk6IEdQSU8xIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzFfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTA6IEdQSU8xIFBpbiAxIEhhbmRsZXIgKi8KKyAgR1BJTzFfMl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTE6IEdQSU8xIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzFfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTI6IEdQSU8xIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzFfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTM6IEdQSU8xIFBpbiA0IEhhbmRsZXIgKi8KKyAgR1BJTzFfNV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTQ6IEdQSU8xIFBpbiA1IEhhbmRsZXIgKi8KKyAgR1BJTzFfNl9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTU6IEdQSU8xIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzFfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTY6IEdQSU8xIFBpbiA3IEhhbmRsZXIgKi8KKyAgR1BJTzFfOF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTc6IEdQSU8xIFBpbiA4IEhhbmRsZXIgKi8KKyAgR1BJTzFfOV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgOTg6IEdQSU8xIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzFfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgOTk6IEdQSU8xIFBpbiAxMCBIYW5kbGVyICovCisgIEdQSU8xXzExX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEwMDogR1BJTzEgUGluIDExIEhhbmRsZXIgKi8KKyAgR1BJTzFfMTJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTAxOiBHUElPMSBQaW4gMTIgSGFuZGxlciAqLworICBHUElPMV8xM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMDI6IEdQSU8xIFBpbiAxMyBIYW5kbGVyICovCisgIEdQSU8xXzE0X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEwMzogR1BJTzEgUGluIDE0IEhhbmRsZXIgKi8KKyAgR1BJTzFfMTVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTA0OiBHUElPMSBQaW4gMTUgSGFuZGxlciAqLworICBHUElPMl8wX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDU6IEdQSU8yIFBpbiAwIEhhbmRsZXIgKi8KKyAgR1BJTzJfMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTA2OiBHUElPMiBQaW4gMSBIYW5kbGVyICovCisgIEdQSU8yXzJfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEwNzogR1BJTzIgUGluIDIgSGFuZGxlciAqLworICBHUElPMl8zX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMDg6IEdQSU8yIFBpbiAzIEhhbmRsZXIgKi8KKyAgR1BJTzJfNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTA5OiBHUElPMiBQaW4gNCBIYW5kbGVyICovCisgIEdQSU8yXzVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExMDogR1BJTzIgUGluIDUgSGFuZGxlciAqLworICBHUElPMl82X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMTE6IEdQSU8yIFBpbiA2IEhhbmRsZXIgKi8KKyAgR1BJTzJfN19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTEyOiBHUElPMiBQaW4gNyBIYW5kbGVyICovCisgIEdQSU8yXzhfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDExMzogR1BJTzIgUGluIDggSGFuZGxlciAqLworICBHUElPMl85X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMTQ6IEdQSU8yIFBpbiA5IEhhbmRsZXIgKi8KKyAgR1BJTzJfMTBfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTE1OiBHUElPMiBQaW4gMTAgSGFuZGxlciAqLworICBHUElPMl8xMV9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTY6IEdQSU8yIFBpbiAxMSBIYW5kbGVyICovCisgIEdQSU8yXzEyX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDExNzogR1BJTzIgUGluIDEyIEhhbmRsZXIgKi8KKyAgR1BJTzJfMTNfSGFuZGxlciwgICAgICAgICAgICAgICAgICAvKiAgMTE4OiBHUElPMiBQaW4gMTMgSGFuZGxlciAqLworICBHUElPMl8xNF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgIC8qICAxMTk6IEdQSU8yIFBpbiAxNCBIYW5kbGVyICovCisgIEdQSU8yXzE1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgLyogIDEyMDogR1BJTzIgUGluIDE1IEhhbmRsZXIgKi8KKyAgR1BJTzNfMF9IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTIxOiBHUElPMyBQaW4gMCBIYW5kbGVyICovCisgIEdQSU8zXzFfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyMjogR1BJTzMgUGluIDEgSGFuZGxlciAqLworICBHUElPM18yX0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjM6IEdQSU8zIFBpbiAyIEhhbmRsZXIgKi8KKyAgR1BJTzNfM19IYW5kbGVyLCAgICAgICAgICAgICAgICAgICAvKiAgMTI0OiBHUElPMyBQaW4gMyBIYW5kbGVyICovCisgIFVBUlRSWDVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgLyogIDEyNTogVUFSVCA1IFJYIEludGVycnVwdCAqLworICBVQVJUVFg1X0hhbmRsZXIsICAgICAgICAgICAgICAgICAgIC8qICAxMjY6IFVBUlQgNSBUWCBJbnRlcnJ1cHQgKi8KKyAgVUFSVDVfSGFuZGxlciwgICAgICAgICAgICAgICAgICAgICAvKiAgMTI3OiBVQVJUIDUgY29tYmluZWQgSW50ZXJydXB0ICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDEyODogUmVzZXJ2ZWQgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMTI5OiBSZXNlcnZlZCAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAxMzA6IFJlc2VydmVkICovCit9OworCisjaWYgZGVmaW5lZCAoIF9fR05VQ19fICkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFJlc2V0IEhhbmRsZXIgY2FsbGVkIG9uIGNvbnRyb2xsZXIgcmVzZXQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIFJlc2V0X0hhbmRsZXIodm9pZCkKK3sKKyAgX19zZXRfTVNQTElNKCh1aW50MzJfdCkoJl9fTVNQX1NUQUNLX0xJTUlUKSk7CisKKyAgU3lzdGVtSW5pdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ01TSVMgU3lzdGVtIEluaXRpYWxpemF0aW9uICovCisKKyAgX19QUk9HUkFNX1NUQVJUKCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRW50ZXIgUHJlTWFpbiAoQyBsaWJyYXJ5IGVudHJ5IHBvaW50KSAqLworfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2Uvc3lzdGVtX2NvcmVfaW5pdC5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL2RldmljZS9zb3VyY2Uvc3lzdGVtX2NvcmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvZGV2aWNlL3NvdXJjZS9zeXN0ZW1fY29yZV9pbml0LmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpOyB5b3UgbWF5CisgKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmF0aXZlIG9mIENNU0lTIFY1LjYuMCBzeXN0ZW1fQVJNdjgxTU1MLmMKKyAqIEdpdCBTSEE6IGI1ZjA2MDNkNmE1ODRkMTcyNGQ5NTJmZDhiMDczNzQ1OGI5MGQ2MmIKKyAqLworCisjaW5jbHVkZSAiY21zaXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIERlZmluZSBjbG9ja3MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgI2RlZmluZSAgWFRBTCAgICAgICAgICAgICAoMzIwMDAwMDBVTCkKKyAjZGVmaW5lICBTWVNURU1fQ0xPQ0sgICAgIChYVEFMKQorICNkZWZpbmUgIFBFUklQSEVSQUxfQ0xPQ0sgKDI1MDAwMDAwVUwpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBFeHRlcm5hbHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZCAoX19WVE9SX1BSRVNFTlQpICYmIChfX1ZUT1JfUFJFU0VOVCA9PSAxVSkKKyAgICBleHRlcm4gdWludDMyX3QgX19WRUNUT1JfVEFCTEU7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN5c3RlbSBDb3JlIENsb2NrIFZhcmlhYmxlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gU1lTVEVNX0NMT0NLOwordWludDMyX3QgUGVyaXBoZXJhbENsb2NrID0gUEVSSVBIRVJBTF9DTE9DSzsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFN5c3RlbSBDb3JlIENsb2NrIHVwZGF0ZSBmdW5jdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlICh2b2lkKQoreworICAgIFN5c3RlbUNvcmVDbG9jayA9IFNZU1RFTV9DTE9DSzsKKyAgICBQZXJpcGhlcmFsQ2xvY2sgPSBQRVJJUEhFUkFMX0NMT0NLOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgU3lzdGVtIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBTeXN0ZW1Jbml0ICh2b2lkKQoreworCisjaWYgZGVmaW5lZCAoX19WVE9SX1BSRVNFTlQpICYmIChfX1ZUT1JfUFJFU0VOVCA9PSAxVSkKKyAgICBTQ0ItPlZUT1IgPSAodWludDMyX3QpKCZfX1ZFQ1RPUl9UQUJMRSk7CisjZW5kaWYKKworI2lmIChkZWZpbmVkIChfX0ZQVV9VU0VEKSAmJiAoX19GUFVfVVNFRCA9PSAxVSkpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19BUk1fRkVBVFVSRV9NVkUpICYmIChfX0FSTV9GRUFUVVJFX01WRSA+PSAwVSkpCisgICAgU0NCLT5DUEFDUiB8PSAoKDNVIDw8IDEwVSoyVSkgfCAgICAgICAgICAgLyogZW5hYmxlIENQMTAgRnVsbCBBY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAoM1UgPDwgMTFVKjJVKSAgKTsgICAgICAgICAvKiBlbmFibGUgQ1AxMSBGdWxsIEFjY2VzcyAqLworI2VuZGlmCisKKyNpZmRlZiBVTkFMSUdORURfU1VQUE9SVF9ESVNBQkxFCisgICAgU0NCLT5DQ1IgfD0gU0NCX0NDUl9VTkFMSUdOX1RSUF9Nc2s7CisjZW5kaWYKKworICAgIC8qIEVuYWJsZSBMb29wIGFuZCBicmFuY2ggaW5mbyBjYWNoZSAqLworICAgIFNDQi0+Q0NSIHw9IFNDQl9DQ1JfTE9CX01zazsKKyAgICBfX0lTQigpOworfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL21taW9fZGVmcy5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL21taW9fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDI4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbW1pb19kZWZzLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMSwgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICoKKyAqLworCisjaWZuZGVmIF9fTU1JT19ERUZTX0hfXworI2RlZmluZSBfX01NSU9fREVGU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGZtX3BlcmlwaGVyYWxzX2RlZi5oIgorCisvKiBCb3VuZGFyeSBoYW5kbGUgYmluZGluZyBtYWNyb3MuICovCisjZGVmaW5lIEhBTkRMRV9QRVJfQVRUUl9CSVRTICAgICAgICAgICAgKDB4NCkKKyNkZWZpbmUgSEFORExFX0FUVFJfUFJJVl9NQVNLICAgICAgICAgICAoKDEgPDwgSEFORExFX1BFUl9BVFRSX0JJVFMpIC0gMSkKKworLyogQWxsb3dlZCBuYW1lZCBNTUlPIG9mIHRoaXMgcGxhdGZvcm0gKi8KK2NvbnN0IHVpbnRwdHJfdCBwYXJ0aXRpb25fbmFtZWRfbW1pb19saXN0W10gPSB7CisgICAgKHVpbnRwdHJfdClURk1fUEVSSVBIRVJBTF9USU1FUjAsCisgICAgKHVpbnRwdHJfdClURk1fUEVSSVBIRVJBTF9TVERfVUFSVCwKK307CisKKy8qCisgKiBQbGF0Zm9ybSBDb3JzdG9uZS1Qb2xhcmlzIG9ubHkgaGFzIG5hbWVkIE1NSU8uCisgKiBJZiB0aGUgcGxhdGZvcm0gaGFzIG51bWJlcmVkIE1NSU8sIGRlZmluZSB0aGVtIGluIGFub3RoZXIgbGlzdC4KKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NTUlPX0RFRlNfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvbXBjX3NpZV9kcnYuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9tcGNfc2llX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGJmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvbXBjX3NpZV9kcnYuYwpAQCAtMCwwICsxLDc5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDIwIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAibXBjX3NpZV9kcnYuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgImNtc2lzX2NvbXBpbGVyLmgiCisKKy8qIFZhbHVlcyBmb3IgaGFyZHdhcmUgdmVyc2lvbiBpbiBQSURSMCByZWcgKi8KKyNkZWZpbmUgU0lFMjAwICAgICAgMHg2MAorI2RlZmluZSBTSUUzMDAgICAgICAweDY1CisKKyNkZWZpbmUgTVBDX1NJRV9CTEtfQ0ZHX09GRlNFVCAgNVUKKworLyogRGVmaW5lcyB3aXRoIG51bWJlcmluZyAoZWc6IFNJRTMwMCkgYXJlIG9ubHkgcmVsZXZhbnQgdG8gdGhlIGdpdmVuIFNJRQorICogdmVyc2lvbi4gRGVmaW5lcyB3aXRob3V0IHRoZSBudW1iZXJpbmcgYXJlIGFwcGxpY2FibGUgdG8gYWxsIFNJRSB2ZXJzaW9ucy4KKyAqLworCisvKiBDVFJMIHJlZ2lzdGVyIGJpdCBpbmRleGVzICovCisjZGVmaW5lIE1QQ19TSUUyMDBfQ1RSTF9TRUNfUkVTUCAgICAgICgxVUwgPDwgNFVMKSAgLyogTVBDIGZhdWx0IHRyaWdnZXJzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXMgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVBDX1NJRTMwMF9DVFJMX0dBVEVfUkVRICAgICAgKDFVTCA8PCA2VUwpICAvKiBSZXF1ZXN0IGZvciBnYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmNvbWluZyB0cmFuc2ZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVBDX1NJRTMwMF9DVFJMX0dBVEVfQUNLICAgICAgKDFVTCA8PCA3VUwpICAvKiBBY2tub3dsZWRnZSBmb3IgZ2F0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW5jb21pbmcgdHJhbnNmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1QQ19TSUVfQ1RSTF9BVVRPSU5DUkVNRU5UICAgICgxVUwgPDwgOFVMKSAgLyogQkxLX0lEWCBhdXRvIGluY3JlbWVudCAqLworI2RlZmluZSBNUENfU0lFMzAwX0NUUkxfU0VDX1JFU1AgICAgICAoMVVMIDw8IDE2VUwpIC8qIFJlc3BvbnNlIHR5cGUgd2hlbiBTVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFza3MgdG8gZ2F0ZSB0aGUgdHJhbnNmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVBDX1NJRTMwMF9DVFJMX0dBVEVfUFJFU0VOVCAgKDFVTCA8PCAyM1VMKSAvKiBHYXRpbmcgZmVhdHVyZSBwcmVzZW50ICovCisjZGVmaW5lIE1QQ19TSUVfQ1RSTF9TRUNfTE9DS19ET1dOICAgICgxVUwgPDwgMzFVTCkgLyogTVBDIFNlY3VyaXR5IGxvY2sgZG93biAqLworCisvKiBQSURSIHJlZ2lzdGVyIGJpdCBtYXNrcyAqLworI2RlZmluZSBNUENfUElEUjBfU0lFX1ZFUlNJT05fTUFTSyAgICAoKDFVTCA8PCA4VUwpIC0gMVVMKQorCisvKiBBUk0gTVBDIGludGVycnVwdCAqLworI2RlZmluZSBNUENfU0lFX0lOVF9CSVQgICAgICAgICAgICAgICAoMVVMKQorCisvKiBFcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBpbnRlcm5hbCBkcml2ZXIgZnVuY3Rpb25zICovCitlbnVtIG1wY19zaWVfaW50ZXJuX2Vycm9yX3QgeworICAgIE1QQ19TSUVfSU5URVJOX0VSUl9OT05FID0gTVBDX1NJRV9FUlJfTk9ORSwKKyAgICBNUENfU0lFX0lOVEVSTl9FUlJfTk9UX0lOX1JBTkdFID0gTVBDX1NJRV9FUlJfTk9UX0lOX1JBTkdFLAorICAgIE1QQ19TSUVfSU5URVJOX0VSUl9OT1RfQUxJR05FRCA9IE1QQ19TSUVfRVJSX05PVF9BTElHTkVELAorICAgIE1QQ19TSUVfSU5URVJOX0VSUl9JTlZBTElEX1JBTkdFID0gTVBDX1NJRV9FUlJfSU5WQUxJRF9SQU5HRSwKKyAgICBNUENfSU5URVJOX0VSUl9SQU5HRV9TRUNfQVRUUl9OT05fQ09NUEFUSUJMRSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQ19TSUVfRVJSX1JBTkdFX1NFQ19BVFRSX05PTl9DT01QQVRJQkxFLAorICAgIC8qIENhbGN1bGF0ZWQgYmxvY2sgaW5kZXgKKyAgICAgKiBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBNUEMuIEl0IHNob3VsZCBuZXZlcgorICAgICAqIGhhcHBlbiB1bmxlc3MgdGhlIGNvbnRyb2xsZWQgcmFuZ2VzIG9mIHRoZSBNUEMgYXJlIG1pc2NvbmZpZ3VyZWQKKyAgICAgKiBpbiB0aGUgZHJpdmVyIG9yIGlmIHRoZSBJUCBoYXMgbm90IGVub3VnaCBMVVRzIHRvIGNvdmVyIHRoZQorICAgICAqIHJhbmdlLCBkdWUgdG8gd3JvbmcgcmVwb3J0ZWQgYmxvY2sgc2l6ZSBmb3IgZXhhbXBsZS4KKyAgICAgKi8KKyAgICBNUENfU0lFX0lOVEVSTl9FUlJfQkxLX0lEWF9UT09fSElHSCA9IC0xLAorCit9OworCisvKiBBUk0gTVBDIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgYWNjZXNzIHN0cnVjdHVyZSAqLworc3RydWN0IG1wY19zaWVfcmVnX21hcF90IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjdHJsOyAgICAgICAvKiAoUi9XKSBNUEMgQ29udHJvbCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkWzNdOy8qIFJlc2VydmVkICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgYmxrX21heDsgICAgLyogKFIvICkgTWF4aW11bSB2YWx1ZSBvZiBibG9jayBiYXNlZCBpbmRleCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGJsa19jZmc7ICAgIC8qIChSLyApIEJsb2NrIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBibGtfaWR4OyAgICAvKiAoUi9XKSBJbmRleCB2YWx1ZSBmb3IgYWNjZXNzaW5nIGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgYmFzZWQgbG9vayB1cCB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGJsa19sdXRuOyAgIC8qIChSL1cpIEJsb2NrIGJhc2VkIGdhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgIExvb2sgVXAgVGFibGUgKExVVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpbnRfc3RhdDsgICAvKiAoUi8gKSBJbnRlcnJ1cHQgc3RhdGUgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpbnRfY2xlYXI7ICAvKiAoIC9XKSBJbnRlcnJ1cHQgY2xlYXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpbnRfZW47ICAgICAvKiAoUi9XKSBJbnRlcnJ1cHQgZW5hYmxlICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgaW50X2luZm8xOyAgLyogKFIvICkgSW50ZXJydXB0IGluZm9ybWF0aW9uIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpbnRfaW5mbzI7ICAvKiAoUi8gKSBJbnRlcnJ1cHQgaW5mb3JtYXRpb24gMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGludF9zZXQ7ICAgIC8qICggL1cpIEludGVycnVwdCBzZXQuIERlYnVnIHB1cnBvc2Ugb25seSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMls5OThdOyAvKiBSZXNlcnZlZCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI0OyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgNCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI1OyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgNSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI2OyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgNiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHI3OyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgNyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIwOyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIyOyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIzOyAgICAgIC8qIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgIC8qIChSLyApIENvbXBvbmVudCBJRCAwICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjE7ICAgICAgLyogKFIvICkgQ29tcG9uZW50IElEIDEgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMjsgICAgICAvKiAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgIC8qIChSLyApIENvbXBvbmVudCBJRCAzICovCit9OworCisvKgorICogQ2hlY2tzIGlmIHRoZSBhZGRyZXNzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIE1QQyBhbmQgcmV0dXJucworICogdGhlIHJhbmdlIGluZGV4IGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4KKyAqCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICBNUEMgZGV2aWNlIHRvIGluaXRpYWxpemUgXHJlZiBtcGNfc2llX2Rldl90CisgKiBccGFyYW1baW5dICBhZGRyICAgICAgICBBZGRyZXNzIHRvIGNoZWNrIGlmIGl0IGlzIGNvbnRyb2xsZWQgYnkgTVBDLgorICogXHBhcmFtW291dF0gYWRkcl9yYW5nZSAgUmFuZ2UgaW5kZXggaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLgorICoKKyAqIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgYmFzZSBpcyBjb250cm9sbGVyIGJ5IHRoZSByYW5nZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBpc19jdHJsX2J5X3JhbmdlX2xpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiogYWRkcl9yYW5nZSkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiByYW5nZTsKKworICAgIGZvcihpID0gMDsgaSA8IGRldi0+ZGF0YS0+bmJyX29mX3JhbmdlczsgaSsrKSB7CisgICAgICAgIHJhbmdlID0gZGV2LT5kYXRhLT5yYW5nZV9saXN0W2ldOworICAgICAgICBpZihhZGRyID49IHJhbmdlLT5iYXNlICYmIGFkZHIgPD0gcmFuZ2UtPmxpbWl0KSB7CisgICAgICAgICAgICAqYWRkcl9yYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXRzIHRoZSBtYXNrcyBzZWxlY3RpbmcgdGhlIGJpdHMgaW4gdGhlIExVVCBvZiB0aGUgTVBDIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBiYXNlIGFkZHJlc3MgKGluY2x1ZGVkKSB1cCB0byB0aGUgbGltaXQgYWRkcmVzcyAoaW5jbHVkZWQpCisgKgorICogXHBhcmFtW2luXSAgIG1wY19kZXYgICAgICAgICAgVGhlIE1QQyBkZXZpY2UuCisgKiBccGFyYW1baW5dICAgYmFzZSAgICAgICAgICAgICBBZGRyZXNzIGluIGEgcmFuZ2UgY29udHJvbGxlZCBieSB0aGlzIE1QQworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluY2x1ZGVkKSwgYWxpZ25lZCBvbiBibG9jayBzaXplLgorICogXHBhcmFtW2luXSAgIGxpbWl0ICAgICAgICAgICAgQWRkcmVzcyBpbiBhIHJhbmdlIGNvbnRyb2xsZWQgYnkgdGhpcyBNUEMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmNsdWRlZCksIGFsaWduZWQgb24gYmxvY2sgc2l6ZS4KKyAqIFxwYXJhbVtvdXRdICByYW5nZSAgICAgICAgICAgIE1lbW9yeSByYW5nZSBpbiB3aGljaCB0aGUgYmFzZSBhZGRyZXNzIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgYXJlLgorICogXHBhcmFtW291dF0gIGZpcnN0X3dvcmRfaWR4ICAgSW5kZXggb2YgdGhlIGZpcnN0IHRvdWNoZWQgd29yZCBpbiB0aGUgTFVULgorICogXHBhcmFtW291dF0gIG5yX3dvcmRzICAgICAgICAgTnVtYmVyIG9mIHdvcmRzIHVzZWQgaW4gdGhlIExVVC4gSWYgMSwgb25seQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfd29yZF9tYXNrIGlzIHZhbGlkIGFuZCBsaW1pdF93b3JkX21hc2sKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGJlIHVzZWQuCisgKiBccGFyYW1bb3V0XSAgZmlyc3Rfd29yZF9tYXNrICBGaXJzdCB3b3JkIG1hc2sgaW4gdGhlIExVVCB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICogXHBhcmFtW291dF0gIGxpbWl0X3dvcmRfbWFzayAgTGltaXQgd29yZCBtYXNrIGluIHRoZSBMVVQgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBtcGNfc2llX2ludGVybl9lcnJvcl90CisgKi8KK3N0YXRpYyBlbnVtIG1wY19zaWVfaW50ZXJuX2Vycm9yX3QgZ2V0X2x1dF9tYXNrcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtcGNfc2llX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBiYXNlLCBjb25zdCB1aW50MzJfdCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiogcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZmlyc3Rfd29yZF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnJfd29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZmlyc3Rfd29yZF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxpbWl0X3dvcmRfbWFzaykKK3sKKyAgICBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCogYmFzZV9yYW5nZTsKKyAgICB1aW50MzJfdCBibG9ja19zaXplOworICAgIHVpbnQzMl90IGJhc2VfYmxvY2tfaWR4OworICAgIHVpbnQzMl90IGJhc2Vfd29yZF9pZHg7CisgICAgdWludDMyX3QgYmxrX21heDsKKyAgICBjb25zdCBzdHJ1Y3QgbXBjX3NpZV9tZW1vcnlfcmFuZ2VfdCogbGltaXRfcmFuZ2U7CisgICAgdWludDMyX3QgbGltaXRfYmxvY2tfaWR4OworICAgIHVpbnQzMl90IGxpbWl0X3dvcmRfaWR4OworICAgIHVpbnQzMl90IG1hc2s7CisgICAgdWludDMyX3Qgbm9ybV9iYXNlOworICAgIHVpbnQzMl90IG5vcm1fbGltaXQ7CisgICAgc3RydWN0IG1wY19zaWVfcmVnX21hcF90KiBwX21wYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGF0IHRoZSBhZGRyZXNzZXMgYXJlIHdpdGhpbiB0aGUgY29udHJvbGxlZCByZWdpb25zCisgICAgICogb2YgdGhpcyBNUEMKKyAgICAgKi8KKyAgICBpZighaXNfY3RybF9ieV9yYW5nZV9saXN0KGRldiwgYmFzZSwgJmJhc2VfcmFuZ2UpIHx8CisgICAgICAgIWlzX2N0cmxfYnlfcmFuZ2VfbGlzdChkZXYsIGxpbWl0LCAmbGltaXRfcmFuZ2UpKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0lOVEVSTl9FUlJfTk9UX0lOX1JBTkdFOworICAgIH0KKworICAgIC8qIEJhc2UgYW5kIGxpbWl0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBzYW1lIHJhbmdlICovCisgICAgaWYoYmFzZV9yYW5nZSAhPSBsaW1pdF9yYW5nZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9JTlRFUk5fRVJSX0lOVkFMSURfUkFOR0U7CisgICAgfQorICAgICpyYW5nZSA9IGJhc2VfcmFuZ2U7CisKKyAgICBibG9ja19zaXplID0gKDEgPDwgKHBfbXBjLT5ibGtfY2ZnICsgTVBDX1NJRV9CTEtfQ0ZHX09GRlNFVCkpOworCisgICAgLyogQmFzZSBhbmQgbGltaXQrMSBhZGRyZXNzZXMgbXVzdCBiZSBhbGlnbmVkIG9uIHRoZSBNUEMgYmxvY2sgc2l6ZSAqLworICAgIGlmKGJhc2UgJSBibG9ja19zaXplIHx8IChsaW1pdCsxKSAlIGJsb2NrX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfSU5URVJOX0VSUl9OT1RfQUxJR05FRDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEdldCBhIG5vcm1hbGl6ZWQgYWRkcmVzcyB0aGF0IGlzIGFuIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgKiBvZiB0aGUgbG93ZXN0IHJhbmdlIGNvbnRyb2xsZWQgYnkgdGhlIE1QQworICAgICAqLworICAgIG5vcm1fYmFzZSAgPSAoYmFzZSAtIGJhc2VfcmFuZ2UtPmJhc2UpICsgYmFzZV9yYW5nZS0+cmFuZ2Vfb2Zmc2V0OworICAgIG5vcm1fbGltaXQgPSAobGltaXQgLSBiYXNlX3JhbmdlLT5iYXNlKSArIGJhc2VfcmFuZ2UtPnJhbmdlX29mZnNldDsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIGJsb2NrIGluZGV4IGFuZCB0byB3aGljaCAzMiBiaXRzIHdvcmQgaXQgYmVsb25ncworICAgICAqLworICAgIGxpbWl0X2Jsb2NrX2lkeCA9IG5vcm1fbGltaXQvYmxvY2tfc2l6ZTsKKyAgICBsaW1pdF93b3JkX2lkeCA9IGxpbWl0X2Jsb2NrX2lkeC8zMjsKKworICAgIGJhc2VfYmxvY2tfaWR4ID0gbm9ybV9iYXNlL2Jsb2NrX3NpemU7CisgICAgYmFzZV93b3JkX2lkeCA9IGJhc2VfYmxvY2tfaWR4LzMyOworCisgICAgaWYoYmFzZV9ibG9ja19pZHggPiBsaW1pdF9ibG9ja19pZHgpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfSU5URVJOX0VSUl9JTlZBTElEX1JBTkdFOworICAgIH0KKworICAgIC8qIFRyYW5zbWl0IHRoZSBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGVyICovCisgICAgKm5yX3dvcmRzID0gbGltaXRfd29yZF9pZHggLSBiYXNlX3dvcmRfaWR4ICsgMTsKKyAgICAqZmlyc3Rfd29yZF9pZHggPSBiYXNlX3dvcmRfaWR4OworCisgICAgLyogTGltaXQgdG8gdGhlIGhpZ2hlc3QgYmxvY2sgdGhhdCBjYW4gYmUgY29uZmlndXJlZCAqLworICAgIGJsa19tYXggPSBwX21wYy0+YmxrX21heDsKKworICAgIGlmKChsaW1pdF93b3JkX2lkeCA+IGJsa19tYXgpIHx8IChiYXNlX3dvcmRfaWR4ID4gYmxrX21heCkpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfSU5URVJOX0VSUl9CTEtfSURYX1RPT19ISUdIOworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIHRoZSBtYXNrIGZvciB0aGUgZmlyc3Qgd29yZCB0byBvbmx5IHNlbGVjdCB0aGUgbGltaXQgTiBiaXRzCisgICAgICovCisgICAgKmZpcnN0X3dvcmRfbWFzayA9IH4oKDEgPDwgKGJhc2VfYmxvY2tfaWR4ICUgMzIpKSAtIDEpOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIG1hc2sgZm9yIHRoZSBsaW1pdCB3b3JkIHRvIHNlbGVjdCBvbmx5IHRoZSBmaXJzdCBNIGJpdHMuCisgICAgICovCisgICAgKmxpbWl0X3dvcmRfbWFzayA9ICgxIDw8ICgobGltaXRfYmxvY2tfaWR4KzEpICUgMzIpKSAtIDE7CisgICAgLyoKKyAgICAgKiBJZiBsaW1pdF93b3JkX21hc2sgaXMgMCwgaXQgbWVhbnMgdGhhdCB0aGUgbGltaXQgdG91Y2hlZCBibG9jayBpbmRleCBpcworICAgICAqIHRoZSBsaW1pdCBpbiBpdHMgd29yZCwgc28gdGhlIGxpbWl0IHdvcmQgbWFzayBoYXMgYWxsIGl0cyBiaXRzIHNlbGVjdGVkCisgICAgICovCisgICAgaWYoKmxpbWl0X3dvcmRfbWFzayA9PSAwKSB7CisgICAgICAgICpsaW1pdF93b3JkX21hc2sgPSAweEZGRkZGRkZGOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlIGJsb2NrcyB0byBjb25maWd1cmUgYXJlIGFsbCBwYWNrZWQgaW4gb25lIHdvcmQsIG9ubHkKKyAgICAgKiB0b3VjaCB0aGlzIHdvcmQuCisgICAgICogQ29kZSB1c2luZyB0aGUgY29tcHV0ZWQgbWFza3Mgc2hvdWxkIHRlc3QgaWYgdGhpcyBtYXNrCisgICAgICogaXMgbm9uLXplcm8sIGFuZCBpZiBzbywgb25seSB1c2UgdGhpcyBvbmUgaW5zdGVhZCBvZiB0aGUgbGltaXRfd29yZF9tYXNrCisgICAgICogYW5kIGZpcnN0X3dvcmRfbWFzay4KKyAgICAgKiBBcyB0aGUgb25seSBiaXRzIHRoYXQgYXJlIHRoZSBzYW1lIGluIGJvdGggbWFza3MgYXJlIHRoZSAxIHRoYXQgd2Ugd2FudAorICAgICAqIHRvIHNlbGVjdCwganVzdCB1c2UgWE9SIHRvIGV4dHJhY3QgdGhlbS4KKyAgICAgKi8KKyAgICBpZihiYXNlX3dvcmRfaWR4ID09IGxpbWl0X3dvcmRfaWR4KSB7CisgICAgICAgIG1hc2sgPSB+KCpmaXJzdF93b3JkX21hc2sgXiAqbGltaXRfd29yZF9tYXNrKTsKKyAgICAgICAgKmZpcnN0X3dvcmRfbWFzayA9IG1hc2s7CisgICAgICAgICpsaW1pdF93b3JkX21hc2sgPSBtYXNrOworICAgIH0KKworICAgIHJldHVybiBNUENfU0lFX0lOVEVSTl9FUlJfTk9ORTsKK30KKworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9pbml0KHN0cnVjdCBtcGNfc2llX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QqKiByYW5nZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbmJyX29mX3JhbmdlcykKK3sKKyAgICBpZigocmFuZ2VfbGlzdCA9PSBOVUxMKSB8fCAobmJyX29mX3JhbmdlcyA9PSAwKSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9JTlZBTElEX0FSRzsKKyAgICB9CisKKyAgICBkZXYtPmRhdGEtPnNpZV92ZXJzaW9uID0gZ2V0X3NpZV92ZXJzaW9uKGRldik7CisKKyAgICBpZiAoKGRldi0+ZGF0YS0+c2llX3ZlcnNpb24gIT0gU0lFMjAwKSAmJgorICAgICAgICAoZGV2LT5kYXRhLT5zaWVfdmVyc2lvbiAhPSBTSUUzMDApKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX1VOU1VQUE9SVEVEX0hBUkRXQVJFX1ZFUlNJT047CisgICAgfQorCisgICAgZGV2LT5kYXRhLT5yYW5nZV9saXN0ID0gcmFuZ2VfbGlzdDsKKyAgICBkZXYtPmRhdGEtPm5icl9vZl9yYW5nZXMgPSBuYnJfb2ZfcmFuZ2VzOworICAgIGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfZ2V0X2Jsb2NrX3NpemUoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGJsa19zaXplKQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9OT1RfSU5JVDsKKyAgICB9CisKKyAgICBpZihibGtfc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0lOVkFMSURfQVJHOworICAgIH0KKworICAgIC8qIENhbGN1bGF0ZSB0aGUgYmxvY2sgc2l6ZSBpbiBieXRlIGFjY29yZGluZyB0byB0aGUgbWFudWFsICovCisgICAgKmJsa19zaXplID0gKDEgPDwgKHBfbXBjLT5ibGtfY2ZnICsgTVBDX1NJRV9CTEtfQ0ZHX09GRlNFVCkpOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfY29uZmlnX3JlZ2lvbihzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtcGNfc2llX3NlY19hdHRyX3QgYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfaW50ZXJuX2Vycm9yX3QgZXJyb3I7CisgICAgdWludDMyX3QgZmlyc3Rfd29yZF9pZHg7CisgICAgdWludDMyX3QgZmlyc3Rfd29yZF9tYXNrOworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgbGltaXRfd29yZF9tYXNrOworICAgIHVpbnQzMl90IGxpbWl0X3dvcmRfaWR4OworICAgIHVpbnQzMl90IG5yX3dvcmRzOworICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiByYW5nZTsKKyAgICB1aW50MzJfdCB3b3JkX3ZhbHVlOworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9OT1RfSU5JVDsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIGJpdG1hc2tzIHVzZWQgdG8gc2VsZWN0IHRoZSBiaXRzIGluIHRoZSBMVVQgKi8KKyAgICBlcnJvciA9IGdldF9sdXRfbWFza3MoZGV2LCBiYXNlLCBsaW1pdCwgJnJhbmdlLCAmZmlyc3Rfd29yZF9pZHgsICZucl93b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X3dvcmRfbWFzaywgJmxpbWl0X3dvcmRfbWFzayk7CisKKyAgICBsaW1pdF93b3JkX2lkeCA9IGZpcnN0X3dvcmRfaWR4ICsgbnJfd29yZHMgLSAxOworCisgICAgaWYoZXJyb3IgIT0gTVBDX1NJRV9JTlRFUk5fRVJSX05PTkUpIHsKKyAgICAgICAgLyogTWFwIGludGVybmFsIGVycm9yIGNvZGUgbG93ZXIgdGhhbiAwIHRvIGEgZ2VuZXJpYyBlcnJwciAqLworICAgICAgICBpZihlcnJvciA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNUENfU0lFX0VSUl9JTlZBTElEX1JBTkdFOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoZW51bSBtcGNfc2llX2Vycm9yX3QpZXJyb3I7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUaGUgbWVtb3J5IHJhbmdlIHNob3VsZCBhbGxvdyBhY2Nlc3NlcyBpbiB3aXRoIHRoZSB3YW50ZWQgc2VjdXJpdHkKKyAgICAgKiBhdHRyaWJ1dGUgaWYgaXQgcmVxdWlyZXMgc3BlY2lhbCBhdHRyaWJ1dGUgZm9yIHN1Y2Nlc3NmdWwgYWNjZXNzZXMKKyAgICAgKi8KKyAgICBpZihyYW5nZS0+YXR0ciAhPSBhdHRyKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0VSUl9SQU5HRV9TRUNfQVRUUl9OT05fQ09NUEFUSUJMRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0YXJ0cyBjaGFuZ2luZyBhY3R1YWwgY29uZmlndXJhdGlvbiBzbyBpc3N1ZSBETUIgdG8gZW5zdXJlIGV2ZXJ5CisgICAgICogdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZCBieSBub3cKKyAgICAgKi8KKyAgICBfX0RNQigpOworCisgICAgLyogU2V0IHRoZSBibG9jayBpbmRleCB0byB0aGUgZmlyc3Qgd29yZCB0aGF0IHdpbGwgYmUgdXBkYXRlZCAqLworICAgIHBfbXBjLT5ibGtfaWR4ID0gZmlyc3Rfd29yZF9pZHg7CisKKyAgICAvKiBJZiBvbmx5IG9uZSB3b3JkIG5lZWRzIHRvIGJlIHRvdWNoZWQgaW4gdGhlIExVVCAqLworICAgIGlmKG5yX3dvcmRzID09IDEpIHsKKyAgICAgICAgd29yZF92YWx1ZSA9IHBfbXBjLT5ibGtfbHV0bjsKKyAgICAgICAgaWYoYXR0ciA9PSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRSkgeworICAgICAgICAgICAgd29yZF92YWx1ZSB8PSBmaXJzdF93b3JkX21hc2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JkX3ZhbHVlICY9IH5maXJzdF93b3JkX21hc2s7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluZGV4IGFnYWluIGJlY2F1c2UgZnVsbCB3b3JkIHJlYWQgb3Igd3JpdGUgY291bGQgaGF2ZQorICAgICAgICAgKiBpbmNyZW1lbnRlZCBpdAorICAgICAgICAgKi8KKyAgICAgICAgcF9tcGMtPmJsa19pZHggPSBmaXJzdF93b3JkX2lkeDsKKyAgICAgICAgcF9tcGMtPmJsa19sdXRuID0gd29yZF92YWx1ZTsKKworICAgICAgICAvKiBDb21taXQgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlICovCisgICAgICAgIF9fRFNCKCk7CisgICAgICAgIF9fSVNCKCk7CisKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7CisgICAgfQorCisgICAgLyogRmlyc3Qgd29yZCAqLworICAgIHdvcmRfdmFsdWUgPSBwX21wYy0+YmxrX2x1dG47CisgICAgaWYoYXR0ciA9PSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRSkgeworICAgICAgICB3b3JkX3ZhbHVlIHw9IGZpcnN0X3dvcmRfbWFzazsKKyAgICB9IGVsc2UgeworICAgICAgICB3b3JkX3ZhbHVlICY9IH5maXJzdF93b3JkX21hc2s7CisgICAgfQorICAgIC8qCisgICAgICogU2V0IHRoZSBpbmRleCBhZ2FpbiBiZWNhdXNlIGZ1bGwgd29yZCByZWFkIG9yIHdyaXRlIGNvdWxkIGhhdmUKKyAgICAgKiBpbmNyZW1lbnRlZCBpdAorICAgICAqLworICAgIHBfbXBjLT5ibGtfaWR4ID0gZmlyc3Rfd29yZF9pZHg7CisgICAgLyogUGFydGlhbGx5IGNvbmZpZ3VyZSB0aGUgZmlyc3Qgd29yZCAqLworICAgIHBfbXBjLT5ibGtfbHV0biA9IHdvcmRfdmFsdWU7CisKKyAgICAvKiBGdWxseSBjb25maWd1cmUgdGhlIGludGVybWVkaWF0ZSB3b3JkcyBpZiB0aGVyZSBhcmUgYW55ICovCisgICAgZm9yKGk9Zmlyc3Rfd29yZF9pZHgrMTsgaTxsaW1pdF93b3JkX2lkeDsgaSsrKSB7CisgICAgICAgIHBfbXBjLT5ibGtfaWR4ID0gaTsKKyAgICAgICAgaWYoYXR0ciA9PSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRSkgeworICAgICAgICAgICAgcF9tcGMtPmJsa19sdXRuID0gMHhGRkZGRkZGRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBfbXBjLT5ibGtfbHV0biA9IDB4MDAwMDAwMDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQYXJ0aWFsbHkgY29uZmlndXJlIHRoZSBsaW1pdCB3b3JkICovCisgICAgcF9tcGMtPmJsa19pZHggPSBsaW1pdF93b3JkX2lkeDsKKyAgICB3b3JkX3ZhbHVlID0gcF9tcGMtPmJsa19sdXRuOworICAgIGlmKGF0dHIgPT0gTVBDX1NJRV9TRUNfQVRUUl9OT05TRUNVUkUpIHsKKyAgICAgICAgd29yZF92YWx1ZSB8PSBsaW1pdF93b3JkX21hc2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd29yZF92YWx1ZSAmPSB+bGltaXRfd29yZF9tYXNrOworICAgIH0KKyAgICBwX21wYy0+YmxrX2lkeCA9IGxpbWl0X3dvcmRfaWR4OworICAgIHBfbXBjLT5ibGtfbHV0biA9IHdvcmRfdmFsdWU7CisKKyAgICAvKiBDb21taXQgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlICovCisgICAgX19EU0IoKTsKKyAgICBfX0lTQigpOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfZ2V0X3JlZ2lvbl9jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtcGNfc2llX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1wY19zaWVfc2VjX2F0dHJfdCogYXR0cikKK3sKKyAgICBlbnVtIG1wY19zaWVfc2VjX2F0dHJfdCBhdHRyX3ByZXY7CisgICAgdWludDMyX3QgYmxvY2tfc2l6ZTsKKyAgICB1aW50MzJfdCBibG9ja19zaXplX21hc2s7CisgICAgZW51bSBtcGNfc2llX2ludGVybl9lcnJvcl90IGVycm9yOworICAgIHVpbnQzMl90IGZpcnN0X3dvcmRfaWR4OworICAgIHVpbnQzMl90IGZpcnN0X3dvcmRfbWFzazsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IGxpbWl0X3dvcmRfaWR4OworICAgIHVpbnQzMl90IGxpbWl0X3dvcmRfbWFzazsKKyAgICB1aW50MzJfdCBucl93b3JkczsKKyAgICBzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqIHBfbXBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgY29uc3Qgc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QqIHJhbmdlOworICAgIHVpbnQzMl90IHdvcmRfdmFsdWU7CisKKyAgICBpZihkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkICE9IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfTk9UX0lOSVQ7CisgICAgfQorCisgICAgaWYoYXR0ciA9PSAwKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0lOVkFMSURfQVJHOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSB0aGUgc2VjdXJpdHkgYXR0cmlidXRlIHRvIG1peGVkIGluIGNhc2Ugb2YgZWFybHkKKyAgICAgKiB0ZXJtaW5hdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLiBBIGNhbGxlciB0aGF0IGRvZXMgbm90IGNoZWNrIHRoZQorICAgICAqIHJldHVybmVkIGVycm9yIHdpbGwgYWN0IGFzIGlmIGl0IGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlCisgICAgICogcmVnaW9uIHF1ZXJpZWQsIHdoaWNoIGlzIHRoZSBzYWZlc3QgYmV0CisgICAgICovCisgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX01JWEVEOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgYmFzZSBhbmQgbGltaXQgYXJlIG5vdCBhbGlnbmVkLCBhbGlnbiB0aGVtIGFuZCBtYWtlIHN1cmUKKyAgICAgKiB0aGF0IHRoZSByZXN1bHRpbmcgcmVnaW9uIGZ1bGx5IGluY2x1ZGVzIHRoZSBvcmlnaW5hbCByZWdpb24KKyAgICAgKi8KKyAgICBibG9ja19zaXplID0gKDEgPDwgKHBfbXBjLT5ibGtfY2ZnICsgTVBDX1NJRV9CTEtfQ0ZHX09GRlNFVCkpOworCisgICAgYmxvY2tfc2l6ZV9tYXNrID0gYmxvY2tfc2l6ZSAtIDE7CisgICAgYmFzZSAmPSB+KGJsb2NrX3NpemVfbWFzayk7CisgICAgbGltaXQgJj0gfihibG9ja19zaXplX21hc2spOworICAgIGxpbWl0ICs9IGJsb2NrX3NpemUgLSAxOyAvKiBSb3VuZCB0byB0aGUgdXBwZXIgYmxvY2sgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlIG9uZSB0byBnZXQgdGhlIHByZWNlZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZGRyZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIEdldCB0aGUgYml0bWFza3MgdXNlZCB0byBzZWxlY3QgdGhlIGJpdHMgaW4gdGhlIExVVCAqLworICAgIGVycm9yID0gZ2V0X2x1dF9tYXNrcyhkZXYsIGJhc2UsIGxpbWl0LCAmcmFuZ2UsICZmaXJzdF93b3JkX2lkeCwgJm5yX3dvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3Rfd29yZF9tYXNrLCAmbGltaXRfd29yZF9tYXNrKTsKKworICAgIGxpbWl0X3dvcmRfaWR4ID0gZmlyc3Rfd29yZF9pZHgrbnJfd29yZHMgLSAxOworCisgICAgaWYoZXJyb3IgIT0gTVBDX1NJRV9JTlRFUk5fRVJSX05PTkUpIHsKKyAgICAgICAgLyogTWFwIGludGVybmFsIGVycm9yIGNvZGUgbG93ZXIgdGhhbiAwIHRvIGdlbmVyaWMgZXJyb3IgKi8KKyAgICAgICAgaWYoZXJyb3IgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTVBDX1NJRV9FUlJfSU5WQUxJRF9SQU5HRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGVudW0gbXBjX3NpZV9lcnJvcl90KWVycm9yOworICAgIH0KKworICAgIC8qIFNldCB0aGUgYmxvY2sgaW5kZXggdG8gdGhlIGZpcnN0IHdvcmQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgKi8KKyAgICBwX21wYy0+YmxrX2lkeCA9IGZpcnN0X3dvcmRfaWR4OworCisgICAgLyogSWYgb25seSBvbmUgd29yZCBuZWVkcyB0byBiZSB0b3VjaGVkIGluIHRoZSBMVVQgKi8KKyAgICBpZihucl93b3JkcyA9PSAxKSB7CisgICAgICAgIHdvcmRfdmFsdWUgPSBwX21wYy0+YmxrX2x1dG47CisgICAgICAgIHdvcmRfdmFsdWUgJj0gZmlyc3Rfd29yZF9tYXNrOworICAgICAgICBpZih3b3JkX3ZhbHVlID09IDApIHsKKyAgICAgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkU7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBtYXNrIGFuZCB0aGUgd29yZCB2YWx1ZSwKKyAgICAgICAgICogaXQgbWVhbnMgdGhhdCB0aGUgc2VjdXJpdHkgYXR0cmlidXRlcyBvZiBibG9ja3MgYXJlIG1peGVkCisgICAgICAgICAqLworICAgICAgICB9IGVsc2UgaWYod29yZF92YWx1ZSBeIGZpcnN0X3dvcmRfbWFzaykgeworICAgICAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX01JWEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTVBDX1NJRV9FUlJfTk9ORTsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHBhcnRpYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgZmlyc3Qgd29yZCAqLworICAgIHdvcmRfdmFsdWUgPSBwX21wYy0+YmxrX2x1dG4gJiBmaXJzdF93b3JkX21hc2s7CisgICAgaWYod29yZF92YWx1ZSA9PSAweDAwMDAwMDAwKSB7CisgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkU7CisgICAgfSBlbHNlIGlmKHdvcmRfdmFsdWUgXiBmaXJzdF93b3JkX21hc2spIHsKKyAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX01JWEVEOworICAgICAgICAvKgorICAgICAgICAgKiBCYWlsIG91dCBhcyB0aGUgc2VjdXJpdHkgYXR0cmlidXRlIHdpbGwgYmUgdGhlIHNhbWUgcmVnYXJkbGVzcworICAgICAgICAgKiBvZiB0aGUgY29uZmlndXJhdGlvbiBvZiBvdGhlciBibG9ja3MKKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBNUENfU0lFX0VSUl9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9OT05TRUNVUkU7CisgICAgfQorICAgIC8qCisgICAgICogU3RvcmUgdGhlIGN1cnJlbnQgZm91bmQgYXR0cmlidXRlLCB0byBjaGVjayB0aGF0IGFsbCB0aGUgYmxvY2tzIGluZGVlZAorICAgICAqIGhhdmUgdGhlIHNhbWUgc2VjdXJpdHkgYXR0cmlidXRlLgorICAgICAqLworICAgIGF0dHJfcHJldiA9ICphdHRyOworCisgICAgLyogR2V0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlcm1lZGlhdGUgd29yZHMgaWYgdGhlcmUgYXJlIGFueSAqLworICAgIGZvcihpPWZpcnN0X3dvcmRfaWR4KzE7IGk8bGltaXRfd29yZF9pZHg7IGkrKykgeworICAgICAgICBwX21wYy0+YmxrX2lkeCA9IGk7CisgICAgICAgIHdvcmRfdmFsdWUgPSBwX21wYy0+YmxrX2x1dG47CisgICAgICAgIGlmKHdvcmRfdmFsdWUgPT0gMHgwMDAwMDAwMCkgeworICAgICAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX1NFQ1VSRTsKKyAgICAgICAgfSBlbHNlIGlmKHdvcmRfdmFsdWUgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9NSVhFRDsKKyAgICAgICAgICAgIHJldHVybiBNUENfU0lFX0VSUl9OT05FOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdGhlIGF0dHJpYnV0ZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgb25lIGZvdW5kIGJlZm9yZSwgYmFpbCBvdXQgKi8KKyAgICAgICAgaWYoKmF0dHIgIT0gYXR0cl9wcmV2KSB7CisgICAgICAgICAgICAqYXR0ciA9IE1QQ19TSUVfU0VDX0FUVFJfTUlYRUQ7CisgICAgICAgICAgICByZXR1cm4gTVBDX1NJRV9FUlJfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBhdHRyX3ByZXYgPSAqYXR0cjsKKyAgICB9CisKKyAgICAvKiBHZXQgdGhlIHBhcnRpYWwgY29uZmlndXJhdGlvbiBvZiB0aGUgbGltaXQgd29yZCAqLworICAgIHBfbXBjLT5ibGtfaWR4ID0gbGltaXRfd29yZF9pZHg7CisgICAgd29yZF92YWx1ZSA9IHBfbXBjLT5ibGtfbHV0biAmIGxpbWl0X3dvcmRfbWFzazsKKyAgICBpZih3b3JkX3ZhbHVlID09IDB4MDAwMDAwMDApIHsKKyAgICAgICAgKmF0dHIgPSBNUENfU0lFX1NFQ19BVFRSX1NFQ1VSRTsKKyAgICB9IGVsc2UgaWYod29yZF92YWx1ZSBeIGZpcnN0X3dvcmRfbWFzaykgeworICAgICAgICAqYXR0ciA9IE1QQ19TSUVfU0VDX0FUVFJfTUlYRUQ7CisgICAgICAgIHJldHVybiBNUENfU0lFX0VSUl9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9OT05TRUNVUkU7CisgICAgfQorCisgICAgaWYoKmF0dHIgIT0gYXR0cl9wcmV2KSB7CisgICAgICAgICphdHRyID0gTVBDX1NJRV9TRUNfQVRUUl9NSVhFRDsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfZ2V0X2N0cmwoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGN0cmxfdmFsKQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9OT1RfSU5JVDsKKyAgICB9CisKKyAgICBpZihjdHJsX3ZhbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0lOVkFMSURfQVJHOworICAgIH0KKworICAgICpjdHJsX3ZhbCA9IHBfbXBjLT5jdHJsOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfc2V0X2N0cmwoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbXBjX2N0cmwpCit7CisgICAgc3RydWN0IG1wY19zaWVfcmVnX21hcF90KiBwX21wYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCAhPSB0cnVlKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX05PVF9JTklUOworICAgIH0KKworICAgIHBfbXBjLT5jdHJsID0gbXBjX2N0cmw7CisKKyAgICByZXR1cm4gTVBDX1NJRV9FUlJfTk9ORTsKK30KKworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9nZXRfc2VjX3Jlc3Aoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbXBjX3NpZV9zZWNfcmVzcF90KiBzZWNfcmVwKQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBib29sIGdhdGluZ19wcmVzZW50ID0gZmFsc2U7CisKKyAgICBpZihkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkICE9IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfTk9UX0lOSVQ7CisgICAgfQorCisgICAgaWYoc2VjX3JlcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX0lOVkFMSURfQVJHOworICAgIH0KKworICAgIGlmIChkZXYtPmRhdGEtPnNpZV92ZXJzaW9uID09IFNJRTIwMCkgeworICAgICAgICBpZihwX21wYy0+Y3RybCAmIE1QQ19TSUUyMDBfQ1RSTF9TRUNfUkVTUCkgeworICAgICAgICAgICAgKnNlY19yZXAgPSBNUENfU0lFX1JFU1BfQlVTX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnNlY19yZXAgPSBNUENfU0lFX1JFU1BfUkFaX1dJOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGRldi0+ZGF0YS0+c2llX3ZlcnNpb24gPT0gU0lFMzAwKSB7CisgICAgICAgIG1wY19zaWVfaXNfZ2F0aW5nX3ByZXNlbnQoZGV2LCAmZ2F0aW5nX3ByZXNlbnQpOworICAgICAgICBpZiAoIWdhdGluZ19wcmVzZW50KSB7CisgICAgICAgICAgICByZXR1cm4gTVBDX1NJRV9FUlJfR0FUSU5HX05PVF9QUkVTRU5UOworICAgICAgICB9CisKKyAgICAgICAgaWYocF9tcGMtPmN0cmwgJiBNUENfU0lFMzAwX0NUUkxfU0VDX1JFU1ApIHsKKyAgICAgICAgICAgIC8qIE1QQyByZXR1cm5zIGEgQlVTIEVSUk9SIHJlc3BvbnNlICovCisgICAgICAgICAgICAqc2VjX3JlcCA9IE1QQ19TSUVfUkVTUF9CVVNfRVJST1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBNUEMgc2V0cyB0aGUgcmVhZHkgc2lnbmFscyBMT1csIHdoaWNoIHN0YWxscyBhbnkgdHJhbnNhY3Rpb25zICovCisgICAgICAgICAgICAqc2VjX3JlcCA9IE1QQ19TSUVfUkVTUF9XQUlUX0dBVElOR19ESVNBQkxFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX1VOU1VQUE9SVEVEX0hBUkRXQVJFX1ZFUlNJT047CisgICAgfQorCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90ICBtcGNfc2llX3NldF9zZWNfcmVzcChzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbXBjX3NpZV9zZWNfcmVzcF90IHNlY19yZXApCit7CisgICAgc3RydWN0IG1wY19zaWVfcmVnX21hcF90KiBwX21wYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIGJvb2wgZ2F0aW5nX3ByZXNlbnQgPSBmYWxzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9OT1RfSU5JVDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5kYXRhLT5zaWVfdmVyc2lvbiA9PSBTSUUyMDApIHsKKyAgICAgICAgaWYgKHNlY19yZXAgPT0gTVBDX1NJRV9SRVNQX0JVU19FUlJPUikgeworICAgICAgICAgICAgcF9tcGMtPmN0cmwgfD0gTVBDX1NJRTIwMF9DVFJMX1NFQ19SRVNQOworICAgICAgICB9IGVsc2UgaWYgKHNlY19yZXAgPT0gTVBDX1NJRV9SRVNQX1JBWl9XSSkgeworICAgICAgICAgICAgcF9tcGMtPmN0cmwgJj0gfk1QQ19TSUUyMDBfQ1RSTF9TRUNfUkVTUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBNUENfU0lFX0lOVkFMSURfQVJHOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGRldi0+ZGF0YS0+c2llX3ZlcnNpb24gPT0gU0lFMzAwKSB7CisgICAgICAgIG1wY19zaWVfaXNfZ2F0aW5nX3ByZXNlbnQoZGV2LCAmZ2F0aW5nX3ByZXNlbnQpOworICAgICAgICBpZiAoIWdhdGluZ19wcmVzZW50KSB7CisgICAgICAgICAgICByZXR1cm4gTVBDX1NJRV9FUlJfR0FUSU5HX05PVF9QUkVTRU5UOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlY19yZXAgPT0gTVBDX1NJRV9SRVNQX0JVU19FUlJPUikgeworICAgICAgICAgICAgcF9tcGMtPmN0cmwgfD0gTVBDX1NJRTMwMF9DVFJMX1NFQ19SRVNQOworICAgICAgICB9IGVsc2UgaWYgKHNlY19yZXAgPT0gTVBDX1NJRV9SRVNQX1dBSVRfR0FUSU5HX0RJU0FCTEVEKSB7CisgICAgICAgICAgICBwX21wYy0+Y3RybCAmPSB+TVBDX1NJRTMwMF9DVFJMX1NFQ19SRVNQOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE1QQ19TSUVfSU5WQUxJRF9BUkc7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX1VOU1VQUE9SVEVEX0hBUkRXQVJFX1ZFUlNJT047CisgICAgfQorCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfaXJxX2VuYWJsZShzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9OT1RfSU5JVDsKKyAgICB9CisKKyAgICBwX21wYy0+aW50X2VuIHw9IE1QQ19TSUVfSU5UX0JJVDsKKworICAgIHJldHVybiBNUENfU0lFX0VSUl9OT05FOworfQorCit2b2lkIG1wY19zaWVfaXJxX2Rpc2FibGUoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqIHBfbXBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBwX21wYy0+aW50X2VuICY9IH5NUENfU0lFX0lOVF9CSVQ7Cit9CisKK3ZvaWQgbXBjX3NpZV9jbGVhcl9pcnEoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqIHBfbXBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBwX21wYy0+aW50X2NsZWFyID0gTVBDX1NJRV9JTlRfQklUOworfQorCit1aW50MzJfdCBtcGNfc2llX2lycV9zdGF0ZShzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIHJldHVybiAocF9tcGMtPmludF9zdGF0ICYgTVBDX1NJRV9JTlRfQklUKTsKK30KKworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9sb2NrX2Rvd24oc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqIHBfbXBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZihkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkICE9IHRydWUpIHsKKyAgICAgICAgcmV0dXJuIE1QQ19TSUVfTk9UX0lOSVQ7CisgICAgfQorCisgICAgcF9tcGMtPmN0cmwgfD0gKE1QQ19TSUVfQ1RSTF9BVVRPSU5DUkVNRU5UCisgICAgICAgICAgICAgICAgICAgIHwgTVBDX1NJRV9DVFJMX1NFQ19MT0NLX0RPV04pOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfaXNfZ2F0aW5nX3ByZXNlbnQoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZ2F0aW5nX3ByZXNlbnQpCit7CisgICAgc3RydWN0IG1wY19zaWVfcmVnX21hcF90KiBwX21wYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCAhPSB0cnVlKSB7CisgICAgICAgIHJldHVybiBNUENfU0lFX05PVF9JTklUOworICAgIH0KKworICAgIGlmIChkZXYtPmRhdGEtPnNpZV92ZXJzaW9uICE9IFNJRTMwMCkgeworICAgICAgICByZXR1cm4gTVBDX1NJRV9VTlNVUFBPUlRFRF9IQVJEV0FSRV9WRVJTSU9OOworICAgIH0KKworICAgICpnYXRpbmdfcHJlc2VudCA9IChib29sKShwX21wYy0+Y3RybCAmIE1QQ19TSUUzMDBfQ1RSTF9HQVRFX1BSRVNFTlQpOworCisgICAgcmV0dXJuIE1QQ19TSUVfRVJSX05PTkU7Cit9CisKK3VpbnQzMl90IGdldF9zaWVfdmVyc2lvbihzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIHJldHVybiBwX21wYy0+cGlkcjAgJiBNUENfUElEUjBfU0lFX1ZFUlNJT05fTUFTSzsKK30KKworYm9vbCBtcGNfc2llX2dldF9nYXRlX2FjayhzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIHJldHVybiAoYm9vbCkocF9tcGMtPmN0cmwgJiBNUENfU0lFMzAwX0NUUkxfR0FURV9BQ0spOworfQorCit2b2lkIG1wY19zaWVfcmVxdWVzdF9nYXRpbmcoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgbXBjX3NpZV9yZWdfbWFwX3QqIHBfbXBjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBwX21wYy0+Y3RybCB8PSBNUENfU0lFMzAwX0NUUkxfR0FURV9SRVE7Cit9CisKK3ZvaWQgbXBjX3NpZV9yZWxlYXNlX2dhdGluZyhzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBtcGNfc2llX3JlZ19tYXBfdCogcF9tcGMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IG1wY19zaWVfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKworICAgIHBfbXBjLT5jdHJsICY9IH5NUENfU0lFMzAwX0NUUkxfR0FURV9SRVE7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvbXBjX3NpZV9kcnYuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9tcGNfc2llX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTgyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvbXBjX3NpZV9kcnYuaApAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDIxIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogXGZpbGUgbXBjX3NpZV9kcnYuaAorICogXGJyaWVmIEdlbmVyaWMgZHJpdmVyIGZvciBBUk0gU0lFIE1lbW9yeSBQcm90ZWN0aW9uCisgKiAgICAgICAgQ29udHJvbGxlcnMgKE1QQykuCisgKi8KKworI2lmbmRlZiBfX01QQ19TSUVfRFJWX0hfXworI2RlZmluZSBfX01QQ19TSUVfRFJWX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEVycm9yIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGRyaXZlciBmdW5jdGlvbnMgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IHsKKyAgICBNUENfU0lFX0VSUl9OT05FLCAgICAgICAgICAvKiE8IE5vIGVycm9yICovCisgICAgTVBDX1NJRV9JTlZBTElEX0FSRywgICAgICAgLyohPCBNUEMgaW52YWxpZCBpbnB1dCBhcmd1bWVudHMgKi8KKyAgICBNUENfU0lFX05PVF9JTklULCAgICAgICAgICAvKiE8IE1QQyBub3QgaW5pdGlhbGl6ZWQgKi8KKyAgICBNUENfU0lFX0VSUl9OT1RfSU5fUkFOR0UsICAvKiE8IEFkZHJlc3MgZG9lcyBub3QgYmVsb25nIHRvIGEgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGNvbnRyb2xsZWQgYnkgdGhlIE1QQyAqLworICAgIE1QQ19TSUVfRVJSX05PVF9BTElHTkVELCAgIC8qITwgQWRkcmVzcyBpcyBub3QgYWxpZ25lZCBvbiB0aGUgYmxvY2sgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgb2YgdGhpcyBNUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBNUENfU0lFX0VSUl9JTlZBTElEX1JBTkdFLCAvKiE8IFRoZSBnaXZlbiBhZGRyZXNzIHJhbmdlIHRvIGNvbmZpZ3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaXMgaW52YWxpZC4gVGhpcyBjb3VsZCBiZSBiZWNhdXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgLSBUaGUgYmFzZSBhbmQgbGltaXQgc3dhcHBlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgLSBUaGUgYmFzZSBhbmQgbGltaXQgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgIGFyZSBpbiBkaWZmZXJlbnQgcmFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTVBDX1NJRV9FUlJfUkFOR0VfU0VDX0FUVFJfTk9OX0NPTVBBVElCTEUsIC8qITwgVGhlIGdpdmVuIHJhbmdlIGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGFjY2Vzc2VkIHdpdGggdGhlIHdhbnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNlY3VyaXR5IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTVBDX1NJRV9VTlNVUFBPUlRFRF9IQVJEV0FSRV9WRVJTSU9OLCAvKiE8IE1QQyBoYXJkd2FyZSB2ZXJzaW9uIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBQSURSMCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBNUENfU0lFX0VSUl9HQVRJTkdfTk9UX1BSRVNFTlQgICAgICAgIC8qITwgTVBDIGdhdGluZyBub3QgcHJlc2VudCBpbiBIVyAqLworfTsKKworLyogU2VjdXJpdHkgYXR0cmlidXRlIHVzZWQgaW4gdmFyaW91cyBwbGFjZSBvZiB0aGUgQVBJICovCitlbnVtIG1wY19zaWVfc2VjX2F0dHJfdCB7CisgICAgTVBDX1NJRV9TRUNfQVRUUl9TRUNVUkUsICAgICAvKiE8IFNlY3VyZSBhdHRyaWJ1dGUgKi8KKyAgICBNUENfU0lFX1NFQ19BVFRSX05PTlNFQ1VSRSwgIC8qITwgTm9uLXNlY3VyZSBhdHRyaWJ1dGUgKi8KKyAgICAvKiE8IFVzZWQgd2hlbiBnZXR0aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgbWVtb3J5IHJhbmdlIGFuZCBzb21lIGJsb2NrcworICAgICAqICAgYXJlIHNlY3VyZSB3aGVyZWFzIHNvbWUgb3RoZXIgYXJlIG5vbiBzZWN1cmUKKyAgICAgKi8KKyAgICBNUENfU0lFX1NFQ19BVFRSX01JWEVELAorfTsKKworLyogV2hhdCBjYW4gaGFwcGVuIHdoZW4gdHJ5aW5nIHRvIGRvIGFuIGlsbGVnYWwgbWVtb3J5IGFjY2VzcyAqLworZW51bSBtcGNfc2llX3NlY19yZXNwX3QgeworICAgIE1QQ19TSUVfUkVTUF9SQVpfV0ksICAgIC8qITwgUmVhZCBBcyBaZXJvLCBXcml0ZSBJZ25vcmVkICovCisgICAgTVBDX1NJRV9SRVNQX0JVU19FUlJPUiwgLyohPCBCdXMgZXJyb3IgKi8KKyAgICBNUENfU0lFX1JFU1BfV0FJVF9HQVRJTkdfRElTQUJMRUQgIC8qITwgV2FpdCB1bnRpbCBnYXRpbmcgaXMgZGlzYWJsZWQgKi8KK307CisKKy8qIERlc2NyaXB0aW9uIG9mIGEgbWVtb3J5IHJhbmdlIGNvbnRyb2xsZWQgYnkgdGhlIE1QQyAqLworc3RydWN0IG1wY19zaWVfbWVtb3J5X3JhbmdlX3QgeworICAgIGNvbnN0IHVpbnQzMl90IGJhc2U7ICAgLyohPCBCYXNlIGFkZHJlc3MgKGluY2x1ZGVkIGluIHRoZSByYW5nZSkgKi8KKyAgICBjb25zdCB1aW50MzJfdCBsaW1pdDsgIC8qITwgTGltaXQgYWRkcmVzcyAoaW5jbHVkZWQgaW4gdGhlIHJhbmdlKSAqLworICAgIGNvbnN0IHVpbnQzMl90IHJhbmdlX29mZnNldDsgLyohPCBPZmZzZXQgb2YgY3VycmVudCByYW5nZSBhcmVhIHRvIHRoZSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHBvaW50IG9mIHRoZSB3aG9sZSBhcmVhICh0aGUgc3VtIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzaXplcyBvZiB0aGUgcHJldmlvdXMgbWVtb3J5IHJhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjb3ZlcmVkIGJ5IHRoZSBzYW1lIE1QQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGNvbnN0IGVudW0gbXBjX3NpZV9zZWNfYXR0cl90IGF0dHI7IC8qITwgT3B0aW9uYWwgc2VjdXJpdHkgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBuZWVkZWQgdG8gYmUgbWF0Y2hlZCB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBhY2Nlc3NpbmcgdGhpcyByYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEZvciBleGFtcGxlLCB0aGUgbm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYWxpYXMgb2YgYSBtZW1vcnkgcmVnaW9uIGNhbiBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGJlIGFjY2Vzc2VkIHVzaW5nIHNlY3VyZSBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBhbmQgY29uZmlndXJpbmcgdGhlIE1QQyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc2VjdXJlIHVzaW5nIHRoYXQgcmFuZ2Ugd2lsbCBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGJlIHBlcm1pdHRlZCBieSB0aGUgZHJpdmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworLyogQVJNIE1QQyBTSUUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCitzdHJ1Y3QgbXBjX3NpZV9kZXZfY2ZnX3QgeworICAgIGNvbnN0IHVpbnQzMl90IGJhc2U7ICAvKiE8IE1QQyBiYXNlIGFkZHJlc3MgKi8KK307CisKKy8qIEFSTSBNUEMgU0lFIGRldmljZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IG1wY19zaWVfZGV2X2RhdGFfdCB7CisgICAgLyohPCBBcnJheSBvZiBwb2ludGVycyB0byBtZW1vcnkgcmFuZ2VzIGNvbnRyb2xsZWQgYnkgdGhlIE1QQyAqLworICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiogcmFuZ2VfbGlzdDsKKyAgICB1aW50OF90IG5icl9vZl9yYW5nZXM7ICAvKiE8IE51bWJlciBvZiBtZW1vcnkgcmFuZ2VzIGluIHRoZSBsaXN0ICovCisgICAgYm9vbCBpc19pbml0aWFsaXplZDsgICAgLyohPCBJbmRpY2F0ZXMgaWYgdGhlIE1QQyBkcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGlzIGluaXRpYWxpemVkIGFuZCBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDMyX3Qgc2llX3ZlcnNpb247ICAgLyohPCBTSUUgdmVyc2lvbiAqLworfTsKKworLyogQVJNIE1QQyBTSUUgZGV2aWNlIHN0cnVjdHVyZSAqLworc3RydWN0IG1wY19zaWVfZGV2X3QgeworICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX2Rldl9jZmdfdCogY29uc3QgY2ZnOyAgLyohPCBNUEMgY29uZmlndXJhdGlvbiAqLworICAgIHN0cnVjdCBtcGNfc2llX2Rldl9kYXRhX3QqIGNvbnN0IGRhdGE7ICAgICAgLyohPCBNUEMgZGF0YSAqLworfTsKKworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6ZXMgYSBNUEMgZGV2aWNlLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICAgICAgICAgICAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqIFxwYXJhbVtpbl0gcmFuZ2VfbGlzdCAgICAgTGlzdCBvZiBtZW1vcnkgcmFuZ2VzIGNvbnRyb2xsZXIgYnkgdGhlIE1QQworICogICAgICAgICAgICAgICAgICAgICAgICAgICAoXHJlZiBtcGNfc2llX21lbW9yeV9yYW5nZV90KS4gVGhpcyBsaXN0IGNhbiBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZWQgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9ucy4KKyAqIFxwYXJhbVtpbl0gbmJyX29mX3JhbmdlcyAgTnVtYmVyIG9mIG1lbW9yeSByYW5nZXMKKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBtcGNfc2llX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfaW5pdChzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBtcGNfc2llX21lbW9yeV9yYW5nZV90KiogcmFuZ2VfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5icl9vZl9yYW5nZXMpOworCisvKioKKyAqIFxicmllZiBHZXRzIE1QQyBibG9jayBzaXplLiBBbGwgcmVnaW9ucyBtdXN0IGJlIGFsaWduZWQgb24gdGhpcyBibG9jaworICogICAgICAgIHNpemUgKGJhc2UgYWRkcmVzcyBhbmQgbGltaXQrMSBhZGRyZXNzKS4KKyAqCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqIFxwYXJhbVtvdXRdIGJsa19zaXplICBNUEMgYmxvY2sgc2l6ZQorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIG1wY19zaWVfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9nZXRfYmxvY2tfc2l6ZShzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYmxrX3NpemUpOworCisvKioKKyAqIFxicmllZiBDb25maWd1cmVzIGEgbWVtb3J5IHJlZ2lvbiAoYmFzZSBhbmQgbGltaXQgaW5jbHVkZWQpLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICAgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKiBccGFyYW1baW5dIGJhc2UgICBCYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiB0byBwb2xsLiBUaGlzIGJvdW5kIGlzCisgKiAgICAgICAgICAgICAgICAgICBpbmNsdWRlZC4gSXQgZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkIGluIGFueSB3YXkuCisgKgorICogXHBhcmFtW2luXSBsaW1pdCAgTGltaXQgYWRkcmVzcyBvZiB0aGUgcmVnaW9uIHRvIHBvbGwuIFRoaXMgYm91bmQgaXMKKyAqICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLiAobGltaXQrMSkgZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkCisgKiAgICAgICAgICAgICAgICAgICBpbiBhbnkgd2F5LgorICogXHBhcmFtW2luXSBhdHRyICAgU2VjdXJpdHkgYXR0cmlidXRlIG9mIHRoZSByZWdpb24uIElmIHRoZSByZWdpb24gaGFzIG1peGVkCisgKiAgICAgICAgICAgICAgICAgICBzZWN1cmUvbm9uLXNlY3VyZSwgYSBzcGVjaWFsIHZhbHVlIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgICAgICAoXHJlZiBtcGNfc2llX3NlY19hdHRyX3QpLgorICoKKyAqICAgICAgICAgICAgSW4gY2FzZSBiYXNlIGFuZCBsaW1pdCsxIGFkZHJlc3NlcyBhcmUgbm90IGFsaWduZWQgb24KKyAqICAgICAgICAgICAgdGhlIGJsb2NrIHNpemUsIHRoZSBlbmNsb3NpbmcgcmVnaW9uIHdpdGggYmFzZSBhbmQKKyAqICAgICAgICAgICAgbGltaXQrMSBhbGlnbmVkIG9uIGJsb2NrIHNpemUgd2lsbCBiZSBxdWVyaWVkLgorICogICAgICAgICAgICBJbiBjYXNlIG9mIGVhcmx5IHRlcm1pbmF0aW9uIG9mIHRoZSBmdW5jdGlvbiAoZXJyb3IpLCB0aGUKKyAqICAgICAgICAgICAgc2VjdXJpdHkgYXR0cmlidXRlIHdpbGwgYmUgc2V0IHRvIE1QQ19TSUVfQVRUUl9NSVhFRC4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBtcGNfc2llX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfY29uZmlnX3JlZ2lvbihzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBtcGNfc2llX3NlY19hdHRyX3QgYXR0cik7CisKKy8qKgorICogXGJyaWVmIEdldHMgYSBtZW1vcnkgcmVnaW9uIGNvbmZpZ3VyYXRpb24oYmFzZSBhbmQgbGltaXQgaW5jbHVkZWQpLgorICoKKyAqIFxwYXJhbVtpbl0gIGRldiAgICBNUEMgZGV2aWNlIFxyZWYgbXBjX3NpZV9kZXZfdAorICogXHBhcmFtW2luXSAgYmFzZSAgIEJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaW9uIHRvIGdldCB0aGUgY29uZmlndXJhdGlvbi4KKyAqIFxwYXJhbVtpbl0gIGxpbWl0ICBMaW1pdCBhZGRyZXNzIG9mIHRoZSByZWdpb24gdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uLgorICogXHBhcmFtW291dF0gYXR0ciAgIFNlY3VyaXR5IGF0dHJpYnV0ZSBvZiB0aGUgcmVnaW9uCisgKiAgICAgICAgICAgICAgICAgICAgXHJlZiBtcGNfc2llX3NlY19hdHRyX3QKKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBtcGNfc2llX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfZ2V0X3JlZ2lvbl9jb25maWcoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbXBjX3NpZV9zZWNfYXR0cl90KiBhdHRyKTsKKworLyoqCisgKiBcYnJpZWYgR2V0cyB0aGUgTVBDIGNvbnRyb2wgdmFsdWUuCisgKgorICogXHBhcmFtW2luXSAgZGV2ICAgICAgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKiBccGFyYW1bb3V0XSBjdHJsX3ZhbCAgQ3VycmVudCBNUEMgY29udHJvbCB2YWx1ZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBtcGNfc2llX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfZ2V0X2N0cmwoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGN0cmxfdmFsKTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyB0aGUgTVBDIGNvbnRyb2wgdmFsdWUuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqIFxwYXJhbVtpbl0gbXBjX2N0cmwgIE5ldyBNUEMgY29udHJvbCB2YWx1ZQorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIG1wY19zaWVfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9zZXRfY3RybChzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtcGNfY3RybCk7CisKKy8qKgorICogXGJyaWVmIEdldHMgdGhlIGNvbmZpZ3VyZWQgc2VjdXJlIHJlc3BvbnNlLgorICoKKyAqIFxwYXJhbVtpbl0gIGRldiAgICAgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKiBccGFyYW1bb3V0XSBzZWNfcmVwICBDb25maWd1cmVkIHNlY3VyZSByZXNwb25zZSAoXHJlZiBtcGNfc2llX3NlY19yZXNwX3QpLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIG1wY19zaWVfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9nZXRfc2VjX3Jlc3Aoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbXBjX3NpZV9zZWNfcmVzcF90KiBzZWNfcmVwKTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyB0aGUgcmVzcG9uc2UgdHlwZSB3aGVuIFNXIGFza3MgdG8gZ2F0ZSB0aGUgaW5jb21pbmcgdHJhbnNmZXJzLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICAgICBNUEMgZGV2aWNlIFxyZWYgbXBjX3NpZV9kZXZfdAorICogXHBhcmFtW2luXSBzZWNfcmVwIFNlY3VyZSByZXNwb25zZSB0byBjb25maWd1cmUgKFxyZWYgbXBjX3NpZV9zZWNfcmVzcF90KS4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXBjX3NpZV9lcnJvcl90IG1wY19zaWVfc2V0X3NlY19yZXNwKHN0cnVjdCBtcGNfc2llX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIG1wY19zaWVfc2VjX3Jlc3BfdCBzZWNfcmVwKTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyBNUEMgaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBNUEMgZGV2aWNlIFxyZWYgbXBjX3NpZV9kZXZfdAorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIG1wY19zaWVfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9pcnFfZW5hYmxlKHN0cnVjdCBtcGNfc2llX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBEaXNhYmxlcyBNUEMgaW50ZXJydXB0CisgKgorICogXHBhcmFtW2luXSBkZXYgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIG1wY19zaWVfaXJxX2Rpc2FibGUoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIENsZWFycyBNUEMgaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBNUEMgZGV2aWNlIFxyZWYgbXBjX3NpZV9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBtcGNfc2llX2NsZWFyX2lycShzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgTVBDIGludGVycnVwdCBzdGF0ZS4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqCisgKiBccmV0dXJuIFJldHVybnMgMSBpZiB0aGUgaW50ZXJydXB0IGlzIGFjdGl2ZSwgMCBvdGhlcndpc2UuCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit1aW50MzJfdCBtcGNfc2llX2lycV9zdGF0ZShzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgTG9ja3MgZG93biB0aGUgTVBDIGNvbmZpZ3VyYXRpb24uCisgKgorICogXHBhcmFtW2luXSBkZXYgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKgorICogXHJldHVybiBSZXR1cm5zIGVycm9yIGNvZGUgYXMgc3BlY2lmaWVkIGluIFxyZWYgbXBjX3NpZV9lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIG1wY19zaWVfZXJyb3JfdCBtcGNfc2llX2xvY2tfZG93bihzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyBpZiBnYXRpbmcgaXMgcHJlc2VudCBpbiBoYXJkd2FyZS4KKyAqCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqIFxwYXJhbVtvdXRdIGdhdGluZ19wcmVzZW50ICBSZXR1cm5zIGlmIGdhdGluZyBpcyBwcmVzZW50IGluIGhhcmR3YXJlLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIG1wY19zaWVfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcGNfc2llX2Vycm9yX3QgbXBjX3NpZV9pc19nYXRpbmdfcHJlc2VudChzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBnYXRpbmdfcHJlc2VudCk7CisKKy8qKgorICogXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIFBlcmlwaGVyYWwgSUQgMCByZWdpc3Rlci4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqCisgKiBccmV0dXJuIFJldHVybnMgdGhlIHZhbHVlIG9mIFBlcmlwaGVyYWwgSUQgMCByZWdpc3Rlci4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IGdldF9zaWVfdmVyc2lvbihzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUmVhZHMgYml0IGluZGljYXRpbmcgYWNrbm93bGVkZ2UgZm9yIGdhdGluZyBpbmNvbWluZyB0cmFuc2ZlcnMuCisgKgorICogXHBhcmFtW2luXSBkZXYgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKgorICogXHJldHVybiBUcnVlIGlmIGFja25vd2xlZGdlIGlzIHNldC4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2Jvb2wgbXBjX3NpZV9nZXRfZ2F0ZV9hY2soc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFNldHMgYml0IHRvIHJlcXVlc3QgZm9yIGdhdGluZyBpbmNvbWluZyB0cmFuc2ZlcnMuCisgKgorICogXHBhcmFtW2luXSBkZXYgIE1QQyBkZXZpY2UgXHJlZiBtcGNfc2llX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIG1wY19zaWVfcmVxdWVzdF9nYXRpbmcoc3RydWN0IG1wY19zaWVfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIENsZWFycyBiaXQgdG8gcmVxdWVzdCBmb3IgZ2F0aW5nIGluY29taW5nIHRyYW5zZmVycy4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgTVBDIGRldmljZSBccmVmIG1wY19zaWVfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgbXBjX3NpZV9yZWxlYXNlX2dhdGluZyhzdHJ1Y3QgbXBjX3NpZV9kZXZfdCogZGV2KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfX01QQ19TSUVfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL21wdV9hcm12OG1fZHJ2LmMgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvbXB1X2FybXY4bV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FhMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL21wdV9hcm12OG1fZHJ2LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAyMSwgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICoKKyAqLworCisjaW5jbHVkZSAibXB1X2FybXY4bV9kcnYuaCIKKyNpbmNsdWRlICJjbXNpcy5oIgorCisvKgorICogRml4TWU6CisgKiBUaGlzIGlzIGEgYmV0YSBxdWFsaXR5IGRyaXZlciBmb3IgTVBVIGluIHY4TS4gVG8gYmUgZmluYWxpemVkLgorICovCisKK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fZW5hYmxlKHN0cnVjdCBtcHVfYXJtdjhtX2Rldl90ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcml2ZGVmX2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGZubWlfZW4pCit7CisgICAgLypObyBlcnJvciBjaGVja2luZyovCisKKyAgICBNUFVfVHlwZSAqbXB1ID0gKE1QVV9UeXBlICopZGV2LT5iYXNlOworCisgICAgLyoKKyAgICAgKiBGaXhNZTogU2V0IDMgcHJlLWRlZmluZWQgTUFJUl9BVFRSIGZvciBtZW1vcnkuIFRoZSBhdHRyaWJ1dGVzIGNvbWUKKyAgICAgKiBmcm9tIGRlZmF1bHQgbWVtb3J5IG1hcCwgbmVlZCB0byBjaGVjayBpZiBmaW5lLXR1bmUgaXMgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogTUFJUjBfMDogUGVyaXBoZXJhbCwgRGV2aWNlLW5HblJFLgorICAgICAqIE1BSVIwXzE6IENvZGUsIFdUIFJBLiBTYW1lIGF0dHIgZm9yIE91dGVyIGFuZCBJbm5lci4KKyAgICAgKiBNQUlSMF8yOiBTUkFNLCBXQldBIFJBLiBTYW1lIGF0dHIgZm9yIE91dGVyIGFuZCBJbm5lci4KKyAgICAgKi8KKyAgICBtcHUtPk1BSVIwID0gKE1QVV9BUk1WOE1fTUFJUl9BVFRSX0RFVklDRV9WQUwgPDwgTVBVX01BSVIwX0F0dHIwX1BvcykgfAorICAgICAgICAgICAgICAgICAoTVBVX0FSTVY4TV9NQUlSX0FUVFJfQ09ERV9WQUwgPDwgTVBVX01BSVIwX0F0dHIxX1BvcykgfAorICAgICAgICAgICAgICAgICAoTVBVX0FSTVY4TV9NQUlSX0FUVFJfREFUQV9WQUwgPDwgTVBVX01BSVIwX0F0dHIyX1Bvcyk7CisKKyAgICBtcHUtPkNUUkwgPQorICAgICAgICAgICAgKHByaXZkZWZfZW4gPyBNUFVfQ1RSTF9QUklWREVGRU5BX01zayA6IDApIHwKKyAgICAgICAgICAgIChoZm5taV9lbiAgID8gTVBVX0NUUkxfSEZOTUlFTkFfTXNrICAgOiAwKTsKKworICAgIC8qRW5zdXJlIGFsbCBjb25maWd1cmF0aW9uIGlzIHdyaXR0ZW4gYmVmb3JlIGVuYWJsZSovCisKKyAgICBtcHUtPkNUUkwgfD0gTVBVX0NUUkxfRU5BQkxFX01zazsKKworICAgIC8qIEVuYWJsZSBNUFUgYmVmb3JlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyAgICBfX0RTQigpOworICAgIF9fSVNCKCk7CisgICAgcmV0dXJuIE1QVV9BUk1WOE1fT0s7Cit9CisKK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fZGlzYWJsZShzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCAqZGV2KQoreworICAgIE1QVV9UeXBlICptcHUgPSAoTVBVX1R5cGUgKilkZXYtPmJhc2U7CisKKyAgICAvKiBSZXNldCBhbGwgZmllbGRzIGFzIGVuYWJsZSBkb2VzIGZ1bGwgc2V0dXAgKi8KKyAgICBtcHUtPkNUUkwgPSAwOworCisgICAgcmV0dXJuIE1QVV9BUk1WOE1fT0s7Cit9CisKKworZW51bSBtcHVfYXJtdjhtX2Vycm9yX3QgbXB1X2FybXY4bV9yZWdpb25fZW5hYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXB1X2FybXY4bV9yZWdpb25fY2ZnX3QgKnJlZ2lvbl9jZmcpCit7CisgICAgTVBVX1R5cGUgKm1wdSA9IChNUFVfVHlwZSAqKWRldi0+YmFzZTsKKworICAgIGVudW0gbXB1X2FybXY4bV9lcnJvcl90IHJldF92YWwgPSBNUFVfQVJNVjhNX09LOworICAgIHVpbnQzMl90IGN0cmxfYmVmb3JlOworICAgIHVpbnQzMl90IGJhc2VfY2ZnOworICAgIHVpbnQzMl90IGxpbWl0X2NmZzsKKworICAgIC8qRklYTUUgOiBBZGQgY29tcGxldGUgZXJyb3IgY2hlY2tpbmcqLworICAgIGlmICgocmVnaW9uX2NmZy0+cmVnaW9uX2Jhc2UgJiB+TVBVX1JCQVJfQkFTRV9Nc2spICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE1QVV9BUk1WOE1fRVJST1I7CisgICAgfQorICAgIC8qIHJlZ2lvbl9saW1pdCBkb2Vzbid0IG5lZWQgdG8gYmUgYWxpZ25lZCBidXQgdGhlIHNjYXR0ZXIKKyAgICAgKiBmaWxlIG5lZWRzIHRvIGJlIHNldHVwIHRvIGVuc3VyZSB0aGF0IHBhcnRpdGlvbnMgZG8gbm90IG92ZXJsYXAuCisgICAgICovCisKKyAgICBjdHJsX2JlZm9yZSA9IG1wdS0+Q1RSTDsKKyAgICBtcHUtPkNUUkwgPSAwOworCisgICAgbXB1LT5STlIgID0gcmVnaW9uX2NmZy0+cmVnaW9uX25yICYgTVBVX1JOUl9SRUdJT05fTXNrOworCisgICAgLyogVGhpcyAwcyB0aGUgbG93ZXIgYml0cyBvZiB0aGUgYmFzZSBhZGRyZXNzICovCisgICAgYmFzZV9jZmcgPSByZWdpb25fY2ZnLT5yZWdpb25fYmFzZSAmIE1QVV9SQkFSX0JBU0VfTXNrOworICAgIGJhc2VfY2ZnIHw9IChyZWdpb25fY2ZnLT5hdHRyX3NoIDw8IE1QVV9SQkFSX1NIX1BvcykgJiBNUFVfUkJBUl9TSF9Nc2s7CisgICAgYmFzZV9jZmcgfD0gKHJlZ2lvbl9jZmctPmF0dHJfYWNjZXNzIDw8IE1QVV9SQkFSX0FQX1BvcykgJiBNUFVfUkJBUl9BUF9Nc2s7CisgICAgYmFzZV9jZmcgfD0gKHJlZ2lvbl9jZmctPmF0dHJfZXhlYyA8PCBNUFVfUkJBUl9YTl9Qb3MpICYgTVBVX1JCQVJfWE5fTXNrOworCisgICAgbXB1LT5SQkFSID0gYmFzZV9jZmc7CisKKyAgICAvKlRoaXMgMHMgdGhlIGxvd2VyIGJpdHMgb2YgYmFzZSBhZGRyZXNzIGJ1dCB0aGV5IGFyZSB0cmVhdGVkIGFzIDEgKi8KKyAgICBsaW1pdF9jZmcgPSAocmVnaW9uX2NmZy0+cmVnaW9uX2xpbWl0LTEpICYgTVBVX1JMQVJfTElNSVRfTXNrOworCisgICAgbGltaXRfY2ZnIHw9IChyZWdpb25fY2ZnLT5yZWdpb25fYXR0cmlkeCA8PCBNUFVfUkxBUl9BdHRySW5keF9Qb3MpICYKKyAgICAgICAgICAgICAgICAgTVBVX1JMQVJfQXR0ckluZHhfTXNrOworCisjaWZkZWYgVEZNX1BYTl9FTkFCTEUKKyAgICBsaW1pdF9jZmcgfD0gKHJlZ2lvbl9jZmctPmF0dHJfcHhuIDw8IE1QVV9STEFSX1BYTl9Qb3MpICYgTVBVX1JMQVJfUFhOX01zazsKKyNlbmRpZgorCisgICAgbGltaXRfY2ZnIHw9IE1QVV9STEFSX0VOX01zazsKKworICAgIG1wdS0+UkxBUiA9IGxpbWl0X2NmZzsKKworICAgIC8qUmVzdG9yZSBtYWluIE1QVSBjb250cm9sKi8KKyAgICBtcHUtPkNUUkwgPSBjdHJsX2JlZm9yZTsKKworICAgIC8qIEVuYWJsZSBNUFUgYmVmb3JlIHRoZSBuZXh0IGluc3RydWN0aW9uICovCisgICAgX19EU0IoKTsKKyAgICBfX0lTQigpOworCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKKworZW51bSBtcHVfYXJtdjhtX2Vycm9yX3QgbXB1X2FybXY4bV9yZWdpb25fZGlzYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wdV9hcm12OG1fZGV2X3QgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnaW9uX25yKQoreworCisgICAgTVBVX1R5cGUgKm1wdSA9IChNUFVfVHlwZSAqKWRldi0+YmFzZTsKKworICAgIGVudW0gbXB1X2FybXY4bV9lcnJvcl90IHJldF92YWwgPSBNUFVfQVJNVjhNX09LOworICAgIHVpbnQzMl90IGN0cmxfYmVmb3JlOworCisgICAgLypGSVhNRSA6IEFkZCBjb21wbGV0ZSBlcnJvciBjaGVja2luZyovCisKKyAgICBjdHJsX2JlZm9yZSA9IG1wdS0+Q1RSTDsKKyAgICBtcHUtPkNUUkwgPSAwOworCisgICAgbXB1LT5STlIgID0gcmVnaW9uX25yICYgTVBVX1JOUl9SRUdJT05fTXNrOworCisgICAgbXB1LT5SQkFSID0gMDsKKyAgICBtcHUtPlJMQVIgPSAwOworCisgICAgLypSZXN0b3JlIG1haW4gTVBVIGNvbnRyb2wqLworICAgIG1wdS0+Q1RSTCA9IGN0cmxfYmVmb3JlOworCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fY2xlYW4oc3RydWN0IG1wdV9hcm12OG1fZGV2X3QgKmRldikKK3sKKyAgICBNUFVfVHlwZSAqbXB1ID0gKE1QVV9UeXBlICopZGV2LT5iYXNlOworICAgIHVpbnQzMl90IGkgPSAobXB1LT5UWVBFICYgTVBVX1RZUEVfRFJFR0lPTl9Nc2spID4+IE1QVV9UWVBFX0RSRUdJT05fUG9zOworCisgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgIG1wdV9hcm12OG1fcmVnaW9uX2Rpc2FibGUoZGV2LCBpLTEpOworICAgICAgICBpLS07CisgICAgfQorCisgICAgcmV0dXJuIE1QVV9BUk1WOE1fT0s7CisKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9tcHVfYXJtdjhtX2Rydi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL21wdV9hcm12OG1fZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYjBiMgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9tcHVfYXJtdjhtX2Rydi5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMjEsIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqCisgKi8KKworI2lmbmRlZiBfX01QVV9BUk1WOE1fRFJWX0hfXworI2RlZmluZSBfX01QVV9BUk1WOE1fRFJWX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBQUklWSUxFR0VEX0RFRkFVTFRfRU5BQkxFIDEKKyNkZWZpbmUgSEFSREZBVUxUX05NSV9FTkFCTEUgICAgICAxCisKKy8qIE1BSVJfQVRUUiAqLworI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9ERVZJQ0VfVkFMICAgICAgMHgwNAorI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9ERVZJQ0VfSURYICAgICAgMAorI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9DT0RFX1ZBTCAgICAgICAgMHhBQQorI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9DT0RFX0lEWCAgICAgICAgMQorI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9EQVRBX1ZBTCAgICAgICAgMHhGRgorI2RlZmluZSBNUFVfQVJNVjhNX01BSVJfQVRUUl9EQVRBX0lEWCAgICAgICAgMgorCitzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCB7CisgICAgY29uc3QgdWludDMyX3QgYmFzZTsKK307CisKK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IHsKKyAgICBNUFVfQVJNVjhNX09LLAorICAgIE1QVV9BUk1WOE1fRVJST1IKK307CisKK2VudW0gbXB1X2FybXY4bV9hdHRyX2V4ZWNfdCB7CisgICAgTVBVX0FSTVY4TV9YTl9FWEVDX09LLAorICAgIE1QVV9BUk1WOE1fWE5fRVhFQ19ORVZFUgorfTsKKworZW51bSBtcHVfYXJtdjhtX2F0dHJfYWNjZXNzX3QgeworICAgIE1QVV9BUk1WOE1fQVBfUldfUFJJVl9PTkxZLAorICAgIE1QVV9BUk1WOE1fQVBfUldfUFJJVl9VTlBSSVYsCisgICAgTVBVX0FSTVY4TV9BUF9ST19QUklWX09OTFksCisgICAgTVBVX0FSTVY4TV9BUF9ST19QUklWX1VOUFJJVgorfTsKKworZW51bSBtcHVfYXJtdjhtX2F0dHJfc2hhcmVkX3QgeworICAgIE1QVV9BUk1WOE1fU0hfTk9ORSwKKyAgICBNUFVfQVJNVjhNX1NIX1VOVVNFRCwKKyAgICBNUFVfQVJNVjhNX1NIX09VVEVSLAorICAgIE1QVV9BUk1WOE1fU0hfSU5ORVIKK307CisKKyNpZmRlZiBURk1fUFhOX0VOQUJMRQorZW51bSBtcHVfYXJtdjhtX2F0dHJfcHJpdl9leGVjX3QgeworICAgIE1QVV9BUk1WOE1fUFJJVl9FWEVDX09LLAorICAgIE1QVV9BUk1WOE1fUFJJVl9FWEVDX05FVkVSCit9OworI2VuZGlmCisKK3N0cnVjdCBtcHVfYXJtdjhtX3JlZ2lvbl9jZmdfdCB7CisgICAgdWludDMyX3QgcmVnaW9uX25yOworICAgIHVpbnQzMl90IHJlZ2lvbl9iYXNlOworICAgIHVpbnQzMl90IHJlZ2lvbl9saW1pdDsKKyAgICB1aW50MzJfdCByZWdpb25fYXR0cmlkeDsKKyAgICBlbnVtIG1wdV9hcm12OG1fYXR0cl9leGVjX3QgICAgICBhdHRyX2V4ZWM7CisgICAgZW51bSBtcHVfYXJtdjhtX2F0dHJfYWNjZXNzX3QgICAgYXR0cl9hY2Nlc3M7CisgICAgZW51bSBtcHVfYXJtdjhtX2F0dHJfc2hhcmVkX3QgICAgYXR0cl9zaDsKKyNpZmRlZiBURk1fUFhOX0VOQUJMRQorICAgIGVudW0gbXB1X2FybXY4bV9hdHRyX3ByaXZfZXhlY190IGF0dHJfcHhuOworI2VuZGlmCit9OworCitzdHJ1Y3QgbXB1X2FybXY4bV9yZWdpb25fY2ZnX3Jhd190IHsKKyAgICB1aW50MzJfdCByZWdpb25fbnI7CisgICAgdWludDMyX3QgcmVnaW9uX2Jhc2U7CisgICAgdWludDMyX3QgcmVnaW9uX2xpbWl0OworfTsKKworCisvKioKKyAqIFxicmllZiBFbmFibGUgTVBVCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgICAgICBNUFUgZGV2aWNlIFxyZWYgbXB1X2FybXY4bV9kZXZfdAorICogXHBhcmFtW2luXSBwcml2ZGVmX2VuICAgICBwcml2aWxlZ2UgZGVmYXVsdCByZWdpb24gMTplbmFibGUgMDpkaXNhYmxlCisgKiBccGFyYW1baW5dIGhmbm1pX2VuICAgICAgIG1wdSBmb3IgaGFyZCBmYXVsdCAmIG5taSAgMTplbmFibGUgMDpkaXNhYmxlCisgKgorICogXHJldHVybiBFcnJvciBjb2RlIFxyZWYgbXB1X2FybXY4bV9lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCisKK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fZW5hYmxlKHN0cnVjdCBtcHVfYXJtdjhtX2Rldl90ICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcml2ZGVmX2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGZubWlfZW4pOworCisvKioKKyAqIFxicmllZiBEaXNhYmxlIE1QVQorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICAgICAgICAgICAgTVBVIGRldmljZSBccmVmIG1wdV9hcm12OG1fZGV2X3QKKyAqCisgKiBccmV0dXJuIEVycm9yIGNvZGUgXHJlZiBtcHVfYXJtdjhtX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fZGlzYWJsZShzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCAqZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRGlzYWJsZSBNUFUgYW5kIGNsZWFuIGFsbCByZWdpb25zCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgICAgICBNUFUgZGV2aWNlIFxyZWYgbXB1X2FybXY4bV9kZXZfdAorICoKKyAqIFxyZXR1cm4gRXJyb3IgY29kZSBccmVmIG1wdV9hcm12OG1fZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBtcHVfYXJtdjhtX2Vycm9yX3QgbXB1X2FybXY4bV9jbGVhbihzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCAqZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlIE1QVSBSZWdpb24KKyAqCisgKiBccGFyYW1baW5dIGRldiAgICAgICAgICAgIE1QVSBkZXZpY2UgXHJlZiBtcHVfYXJtdjhtX2Rldl90CisgKiBccGFyYW1baW5dIHJlZ2lvbl9jZmcgICAgIE1QVSByZWdpb24gY29uZmlnIFxyZWYgbXB1X2FybXY4bV9yZWdpb25fY2ZnX3QKKyAqCisgKiBccmV0dXJuIEVycm9yIGNvZGUgXHJlZiBtcHVfYXJtdjhtX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gbXB1X2FybXY4bV9lcnJvcl90IG1wdV9hcm12OG1fcmVnaW9uX2VuYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wdV9hcm12OG1fZGV2X3QgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1wdV9hcm12OG1fcmVnaW9uX2NmZ190ICpyZWdpb25fY2ZnKTsKKworLyoqCisgKiBcYnJpZWYgRGlzYWJsZSBNUFUgUmVnaW9uCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgICAgICBNUFUgZGV2aWNlIFxyZWYgbXB1X2FybXY4bV9kZXZfdAorICogXHBhcmFtW2luXSByZWdpb25fbnIgICAgICAgICAgICBSZWdpb24gbnVtYmVyCisgKgorICogXHJldHVybiBFcnJvciBjb2RlIFxyZWYgbXB1X2FybXY4bV9lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIG1wdV9hcm12OG1fZXJyb3JfdCBtcHVfYXJtdjhtX3JlZ2lvbl9kaXNhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXB1X2FybXY4bV9kZXZfdCAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZWdpb25fbnIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19NUFVfQVJNVjhNX0RSVl9IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9wcGNfcG9sYXJpc19kcnYuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9wcGNfcG9sYXJpc19kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQ1NGQzCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3BwY19wb2xhcmlzX2Rydi5jCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgQXJtIExpbWl0ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAicHBjX3BvbGFyaXNfZHJ2LmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvKiBEZWZhdWx0IHBlcmlwaGVyYWwgc3RhdGVzICovCisjZGVmaW5lIFNFQ1VSRV9BU19ERUZBVUxUX1BFUklQSEVSQUxfU1RBVEUgIHRydWUKKyNkZWZpbmUgUFJJVklMRUdFX09OTFlfQVNfREVGQVVMVF9QRVJJUEhFUkFMX1NUQVRFICB0cnVlCisKKy8qIFNlY3VyZSBBY2Nlc3MgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBCbG9jayAqLworc3RydWN0IHBvbGFyaXNfc2FjZmdfYmxvY2tfdCB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQwWzhdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHNlY3BwY2ludHN0YXQ7ICAvKiAweDAyMCAoUi8gKSBTZWN1cmUgUFBDIElSUSBTdGF0dXMgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNwcGNpbnRjbHI7ICAgLyogMHgwMjQgKFIvVykgU2VjdXJlIFBQQyBJUlEgQ2xlYXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzZWNwcGNpbnRlbjsgICAgLyogMHgwMjggKFIvVykgU2VjdXJlIFBQQyBJUlEgRW5hYmxlICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQxWzldOworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5uc3BwYzA7ICAgICAvKiAweDA1MCAoUi9XKSBOb24tc2VjdXJlIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uIHRoZSBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMlszXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcGNleHAwOyAgLyogMHgwNjAgKFIvVykgRXhwYW5zaW9uIDAgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE1haW4gSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFpbm5zcHBjZXhwMTsgIC8qIDB4MDY0IChSL1cpIEV4cGFuc2lvbiAxIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQWNjZXNzIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUHJvdGVjdGlvbiBDb250cm9sIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBNYWluIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5uc3BwY2V4cDI7ICAvKiAweDA2OCAoUi9XKSBFeHBhbnNpb24gMiBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgTWFpbiBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcGNleHAzOyAgLyogMHgwNkMgKFIvVykgRXhwYW5zaW9uIDMgTm9uLXNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIE1haW4gSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcGMwOyAgIC8qIDB4MDcwIChSL1cpIE5vbi1zZWN1cmUgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDAgb24gdGhlIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcGMxOyAgIC8qIDB4MDc0IChSL1cpIE5vbi1zZWN1cmUgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDEgb24gdGhlIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQzWzJdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMDsvKiAweDA4MCAoUi9XKSBFeHBhbnNpb24gMCBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMTsvKiAweDA4NCAoUi9XKSBFeHBhbnNpb24gMSBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMjsvKiAweDA4OCAoUi9XKSBFeHBhbnNpb24gMiBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaG5zcHBjZXhwMzsvKiAweDA4QyAoUi9XKSBFeHBhbnNpb24gMyBOb24tc2VjdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEJ1cyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwYzA7ICAgICAvKiAweDA5MCAoUi9XKSBTZWN1cmUgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uIE1haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ0WzNdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDA7ICAvKiAweDBBMCAoUi9XKSBFeHBhbnNpb24gMCBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDE7ICAvKiAweDBBNCAoUi9XKSBFeHBhbnNpb24gMSBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDI7ICAvKiAweDBBOCAoUi9XKSBFeHBhbnNpb24gMiBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5zcHBwY2V4cDM7ICAvKiAweDBBQyAoUi9XKSBFeHBhbnNpb24gMyBTZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBlcmlwaHNwcHBjMDsgICAvKiAweDBCMCAoUi9XKSBTZWN1cmUgVW5wcml2aWxlZ2VkIEFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIFByb3RlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCAwIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGMxOyAgIC8qIDB4MEI0IChSL1cpIFNlY3VyZSBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIDEgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUGVyaXBoZXJhbCBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDVbMl07CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAwOy8qIDB4MEMwIChSL1cpIEV4cGFuc2lvbiAwIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAxOy8qIDB4MEM0IChSL1cpIEV4cGFuc2lvbiAxIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAyOy8qIDB4MEM4IChSL1cpIEV4cGFuc2lvbiAyIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBoc3BwcGNleHAzOy8qIDB4MENDIChSL1cpIEV4cGFuc2lvbiAzIFNlY3VyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBVbnByaXZpbGVnZWQgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBDb250cm9sIG9uIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ2Wzk2MF07CisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjQ7ICAgICAgICAgIC8qIDB4RkQwIChSLyApIFBlcmlwaGVyYWwgSUQgNCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkN1szXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMDsgICAgICAgICAgLyogMHhGRTAgKFIvICkgUGVyaXBoZXJhbCBJRCAwICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjE7ICAgICAgICAgIC8qIDB4RkU0IChSLyApIFBlcmlwaGVyYWwgSUQgMSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIyOyAgICAgICAgICAvKiAweEZFOCAoUi8gKSBQZXJpcGhlcmFsIElEIDIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMzsgICAgICAgICAgLyogMHhGRUMgKFIvICkgUGVyaXBoZXJhbCBJRCAzICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjA7ICAgICAgICAgIC8qIDB4RkYwIChSLyApIENvbXBvbmVudCBJRCAwICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjE7ICAgICAgICAgIC8qIDB4RkY0IChSLyApIENvbXBvbmVudCBJRCAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjI7ICAgICAgICAgIC8qIDB4RkY4IChSLyApIENvbXBvbmVudCBJRCAyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjM7ICAgICAgICAgIC8qIDB4RkZDIChSLyApIENvbXBvbmVudCBJRCAzICovCit9OworCisvKiBQUEMgaW50ZXJydXB0IHBvc2l0aW9uIG1hc2sgKi8KKyNkZWZpbmUgUEVSSVBIX1BQQzBfSU5UX1BPU19NQVNLICAgICAoMVVMIDw8IDApCisjZGVmaW5lIFBFUklQSF9QUEMxX0lOVF9QT1NfTUFTSyAgICAgKDFVTCA8PCAxKQorI2RlZmluZSBQRVJJUEhfUFBDRVhQMF9JTlRfUE9TX01BU0sgICgxVUwgPDwgNCkKKyNkZWZpbmUgUEVSSVBIX1BQQ0VYUDFfSU5UX1BPU19NQVNLICAoMVVMIDw8IDUpCisjZGVmaW5lIFBFUklQSF9QUENFWFAyX0lOVF9QT1NfTUFTSyAgKDFVTCA8PCA2KQorI2RlZmluZSBQRVJJUEhfUFBDRVhQM19JTlRfUE9TX01BU0sgICgxVUwgPDwgNykKKyNkZWZpbmUgTUFJTl9QUEMwX0lOVF9QT1NfTUFTSyAgICAgICAoMVVMIDw8IDE2KQorI2RlZmluZSBNQUlOX1BQQ0VYUDBfSU5UX1BPU19NQVNLICAgICgxVUwgPDwgMjApCisjZGVmaW5lIE1BSU5fUFBDRVhQMV9JTlRfUE9TX01BU0sgICAgKDFVTCA8PCAyMSkKKyNkZWZpbmUgTUFJTl9QUENFWFAyX0lOVF9QT1NfTUFTSyAgICAoMVVMIDw8IDIyKQorI2RlZmluZSBNQUlOX1BQQ0VYUDNfSU5UX1BPU19NQVNLICAgICgxVUwgPDwgMjMpCisKKy8qIE5vbi1zZWN1cmUgQWNjZXNzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQmxvY2sgKi8KK3N0cnVjdCBwb2xhcmlzX25zYWNmZ19ibG9ja190IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDBbMzZdOworICAgIHZvbGF0aWxlIHVpbnQzMl90IG1haW5uc3BwcGMwOyAgICAgLyogMHgwOTAgKFIvVykgTm9uLXNlY3VyZSBVbnByaXZpbGVnZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIEFjY2VzcyBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQcm90ZWN0aW9uIENvbnRyb2wgMCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgTWFpbiBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDFbM107CisKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcHBjZXhwMDsgIC8qIDB4MEEwIChSL1cpIEV4cGFuc2lvbiAwIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcHBjZXhwMTsgIC8qIDB4MEE0IChSL1cpIEV4cGFuc2lvbiAxIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcHBjZXhwMjsgIC8qIDB4MEE4IChSL1cpIEV4cGFuc2lvbiAyIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBtYWlubnNwcHBjZXhwMzsgIC8qIDB4MEFDIChSL1cpIEV4cGFuc2lvbiAzIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBNYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZXJpcGhuc3BwcGMwOyAgIC8qIDB4MEIwIChSL1cpIE5vbi1zZWN1cmUgVW5wcml2aWxlZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBBY2Nlc3MgUGVyaXBoZXJhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgUHJvdGVjdGlvbiBDb250cm9sIDAgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgSW50ZXJjb25uZWN0ICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGVyaXBobnNwcHBjMTsgICAvKiAweDBCNCAoUi9XKSBOb24tc2VjdXJlIFVucHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQWNjZXNzIFBlcmlwaGVyYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFByb3RlY3Rpb24gQ29udHJvbCAxIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBQZXJpcGhlcmFsIEludGVyY29ubmVjdCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkMlsyXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZXJpcGhuc3BwcGNleHAwOy8qIDB4MEMwIChSL1cpIEV4cGFuc2lvbiAwIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZXJpcGhuc3BwcGNleHAxOy8qIDB4MEM0IChSL1cpIEV4cGFuc2lvbiAxIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZXJpcGhuc3BwcGNleHAyOy8qIDB4MEM4IChSL1cpIEV4cGFuc2lvbiAyIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwZXJpcGhuc3BwcGNleHAzOy8qIDB4MENDIChSL1cpIEV4cGFuc2lvbiAzIE5vbi1zZWN1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFVucHJpdmlsZWdlZCBBY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgIFBlcmlwaGVyYWwgUHJvdGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgQ29udHJvbCBvbiBQZXJpcGhlcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICBJbnRlcmNvbm5lY3QgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDNbOTYwXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyNDsgICAgICAgICAgIC8qIDB4RkQwIChSLyApIFBlcmlwaGVyYWwgSUQgNCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkNFszXTsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMDsgICAgICAgICAgIC8qIDB4RkUwIChSLyApIFBlcmlwaGVyYWwgSUQgMCAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHBpZHIxOyAgICAgICAgICAgLyogMHhGRTQgKFIvICkgUGVyaXBoZXJhbCBJRCAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgcGlkcjI7ICAgICAgICAgICAvKiAweEZFOCAoUi8gKSBQZXJpcGhlcmFsIElEIDIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBwaWRyMzsgICAgICAgICAgIC8qIDB4RkVDIChSLyApIFBlcmlwaGVyYWwgSUQgMyAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIwOyAgICAgICAgICAgLyogMHhGRjAgKFIvICkgQ29tcG9uZW50IElEIDAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjaWRyMTsgICAgICAgICAgIC8qIDB4RkY0IChSLyApIENvbXBvbmVudCBJRCAxICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY2lkcjI7ICAgICAgICAgICAvKiAweEZGOCAoUi8gKSBDb21wb25lbnQgSUQgMiAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNpZHIzOyAgICAgICAgICAgLyogMHhGRkMgKFIvICkgQ29tcG9uZW50IElEIDMgKi8KK307CisKK2VudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCBwcGNfcG9sYXJpc19pbml0KHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX2Jsb2NrX3QqIHBfc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcG9sYXJpc19zYWNmZ19ibG9ja190KilkZXYtPmNmZy0+c2FjZmdfYmFzZTsKKyAgICBzdHJ1Y3QgcG9sYXJpc19uc2FjZmdfYmxvY2tfdCogcF9uc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHBvbGFyaXNfbnNhY2ZnX2Jsb2NrX3QqKWRldi0+Y2ZnLT5uc2FjZmdfYmFzZTsKKworICAgIHN3aXRjaChkZXYtPmNmZy0+cHBjX25hbWUpIHsKKyAgICAgICAgLyogQ2FzZSBmb3IgTUFJTjAgKi8KKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19NQUlOMDoKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+bWFpbm5zcHBjMDsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfc3BfcHBjICAgPSAmcF9zYWNmZy0+bWFpbnNwcHBjMDsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+bnNhY2ZnX25zcF9wcGMgPSAmcF9uc2FjZmctPm1haW5uc3BwcGMwOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBNQUlOX1BQQzBfSU5UX1BPU19NQVNLOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogQ2FzZSBmb3IgTUFJTiBFWFBYICovCisgICAgICAgIGNhc2UgUFBDX1BPTEFSSVNfTUFJTl9FWFAwOgorICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19uc19wcGMgICA9ICZwX3NhY2ZnLT4gbWFpbm5zcHBjZXhwMDsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfc3BfcHBjICAgPSAmcF9zYWNmZy0+IG1haW5zcHBwY2V4cDA7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5tYWlubnNwcHBjZXhwMDsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrICAgID0gTUFJTl9QUENFWFAwX0lOVF9QT1NfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBQQ19QT0xBUklTX01BSU5fRVhQMToKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+bWFpbm5zcHBjZXhwMTsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfc3BfcHBjICAgPSAmcF9zYWNmZy0+bWFpbnNwcHBjZXhwMTsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+bnNhY2ZnX25zcF9wcGMgPSAmcF9uc2FjZmctPm1haW5uc3BwcGNleHAxOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBNQUlOX1BQQ0VYUDFfSU5UX1BPU19NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFBDX1BPTEFSSVNfTUFJTl9FWFAyOgorICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19uc19wcGMgICA9ICZwX3NhY2ZnLT5tYWlubnNwcGNleHAyOworICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMgICA9ICZwX3NhY2ZnLT5tYWluc3BwcGNleHAyOworICAgICAgICAgICAgZGV2LT5kYXRhLT5uc2FjZmdfbnNwX3BwYyA9ICZwX25zYWNmZy0+bWFpbm5zcHBwY2V4cDI7CisgICAgICAgICAgICBkZXYtPmRhdGEtPmludF9iaXRfbWFzayAgICA9IE1BSU5fUFBDRVhQMl9JTlRfUE9TX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19NQUlOX0VYUDM6CisgICAgICAgICAgICBkZXYtPmRhdGEtPnNhY2ZnX25zX3BwYyAgID0gJnBfc2FjZmctPm1haW5uc3BwY2V4cDM7CisgICAgICAgICAgICBkZXYtPmRhdGEtPnNhY2ZnX3NwX3BwYyAgID0gJnBfc2FjZmctPm1haW5zcHBwY2V4cDM7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5tYWlubnNwcHBjZXhwMzsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrICAgID0gTUFJTl9QUENFWFAzX0lOVF9QT1NfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIENhc2UgZm9yIFBFUklQSFggKi8KKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19QRVJJUEgwOgorICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19uc19wcGMgICA9ICZwX3NhY2ZnLT5wZXJpcGhuc3BwYzA7CisgICAgICAgICAgICBkZXYtPmRhdGEtPnNhY2ZnX3NwX3BwYyAgID0gJnBfc2FjZmctPnBlcmlwaHNwcHBjMDsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+bnNhY2ZnX25zcF9wcGMgPSAmcF9uc2FjZmctPnBlcmlwaG5zcHBwYzA7CisgICAgICAgICAgICBkZXYtPmRhdGEtPmludF9iaXRfbWFzayAgICA9IFBFUklQSF9QUEMwX0lOVF9QT1NfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBQQ19QT0xBUklTX1BFUklQSDE6CisgICAgICAgICAgICBkZXYtPmRhdGEtPnNhY2ZnX25zX3BwYyAgID0gJnBfc2FjZmctPnBlcmlwaG5zcHBjMTsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfc3BfcHBjICAgPSAmcF9zYWNmZy0+cGVyaXBoc3BwcGMxOworICAgICAgICAgICAgZGV2LT5kYXRhLT5uc2FjZmdfbnNwX3BwYyA9ICZwX25zYWNmZy0+cGVyaXBobnNwcHBjMTsKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrICAgID0gUEVSSVBIX1BQQzFfSU5UX1BPU19NQVNLOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogQ2FzZSBmb3IgUEVSSVBIIEVYUFggKi8KKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMDoKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+cGVyaXBobnNwcGNleHAwOworICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMgICA9ICZwX3NhY2ZnLT5wZXJpcGhzcHBwY2V4cDA7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5wZXJpcGhuc3BwcGNleHAwOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBQRVJJUEhfUFBDRVhQMF9JTlRfUE9TX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMToKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+cGVyaXBobnNwcGNleHAxOworICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMgICA9ICZwX3NhY2ZnLT5wZXJpcGhzcHBwY2V4cDE7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5wZXJpcGhuc3BwcGNleHAxOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBQRVJJUEhfUFBDRVhQMV9JTlRfUE9TX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMjoKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+cGVyaXBobnNwcGNleHAyOworICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMgICA9ICZwX3NhY2ZnLT5wZXJpcGhzcHBwY2V4cDI7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5wZXJpcGhuc3BwcGNleHAyOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBQRVJJUEhfUFBDRVhQMl9JTlRfUE9TX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUENfUE9MQVJJU19QRVJJUEhfRVhQMzoKKyAgICAgICAgICAgIGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjICAgPSAmcF9zYWNmZy0+cGVyaXBobnNwcGNleHAzOworICAgICAgICAgICAgZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMgICA9ICZwX3NhY2ZnLT5wZXJpcGhzcHBwY2V4cDM7CisgICAgICAgICAgICBkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjID0gJnBfbnNhY2ZnLT5wZXJpcGhuc3BwcGNleHAzOworICAgICAgICAgICAgZGV2LT5kYXRhLT5pbnRfYml0X21hc2sgICAgPSBQRVJJUEhfUFBDRVhQM19JTlRfUE9TX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBQUENfUE9MQVJJU19FUlJfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfQorCisgICAgZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9IHRydWU7CisKKyAgICByZXR1cm4gUFBDX1BPTEFSSVNfRVJSX05PTkU7Cit9CisKK2VudW0gcHBjX3BvbGFyaXNfZXJyb3JfdAorcHBjX3BvbGFyaXNfY29uZmlnX3ByaXZpbGVnZShzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QqIGRldiwgdWludDMyX3QgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHBwY19wb2xhcmlzX3NlY19hdHRyX3Qgc2VjX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdCBwcml2X2F0dHIpCit7CisgICAgaWYoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCAhPSB0cnVlKSB7CisgICAgICAgIHJldHVybiBQUENfUE9MQVJJU19FUlJfTk9UX0lOSVQ7CisgICAgfQorCisgICAgaWYoc2VjX2F0dHIgPT0gUFBDX1BPTEFSSVNfU0VDVVJFX0FDQ0VTUykgeworI2lmIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKQorICAgICAgICAvKiBVc2VzIHNlY3VyZSB1bnByaXZpbGVnZWQgYWNjZXNzIGFkZHJlc3MgKFNBQ0ZHKSB0byBzZXQgcHJpdmlsZWdlCisgICAgICAgICAqIGF0dHJpYnV0ZQorICAgICAgICAgKi8KKyAgICAgICAgaWYocHJpdl9hdHRyID09IFBQQ19QT0xBUklTX1BSSVZfT05MWV9BQ0NFU1MpIHsKKyAgICAgICAgICAgICooZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMpICY9IH5tYXNrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKihkZXYtPmRhdGEtPnNhY2ZnX3NwX3BwYykgfD0gbWFzazsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgLyogQ29uZmlndXJpbmcgc2VjdXJpdHkgZnJvbSBOb24tU2VjdXJlIGFwcGxpY2F0aW9uIGlzIG5vdCBwZXJtaXR0ZWQuICovCisgICAgICAgIHJldHVybiBQUENfUE9MQVJJU19FUlJfTk9UX1BFUk1JVFRFRDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFVzZXMgbm9uLXNlY3VyZSB1bnByaXZpbGVnZWQgYWNjZXNzIGFkZHJlc3MgKE5TQUNGRykgdG8gc2V0CisgICAgICAgICAqIHByaXZpbGVnZSBhdHRyaWJ1dGUgKi8KKyAgICAgICAgaWYocHJpdl9hdHRyID09IFBQQ19QT0xBUklTX1BSSVZfT05MWV9BQ0NFU1MpIHsKKyAgICAgICAgICAgICooZGV2LT5kYXRhLT5uc2FjZmdfbnNwX3BwYykgJj0gfm1hc2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqKGRldi0+ZGF0YS0+bnNhY2ZnX25zcF9wcGMpIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUFBDX1BPTEFSSVNfRVJSX05PTkU7Cit9CisKK2Jvb2wgcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3ByaXZfb25seShzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2spCit7CisgICAgaWYoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCAhPSB0cnVlKSB7CisgICAgICAgIC8qIFJldHVybiB0cnVlIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgcHJpdmlsZWdlIG9ubHkgKi8KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisgICAgLyogSW4gc2VjdXJlIGRvbWFpbiBlaXRoZXIgc2VjdXJlIG9yIG5vbi1zZWN1cmUgcHJpdmlsZWdlIGFjY2VzcyBpcyByZXR1cm5lZAorICAgICAqIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uICovCisgICAgaWYgKCgqKGRldi0+ZGF0YS0+c2FjZmdfbnNfcHBjKSAmIG1hc2spID09IDApIHsKKyAgICAgICAgLyogUmV0dXJucyBzZWN1cmUgdW5wcml2aWxlZ2VkIGFjY2VzcyAoU0FDRkcpICovCisgICAgICAgIHJldHVybiAoKCooZGV2LT5kYXRhLT5zYWNmZ19zcF9wcGMpICYgbWFzaykgPT0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmV0dXJucyBub24tc2VjdXJlIHVucHJpdmlsZWdlZCBhY2Nlc3MgKE5TQUNGRykgKi8KKyAgICAgICAgcmV0dXJuICgoKihkZXYtPmRhdGEtPm5zYWNmZ19uc3BfcHBjKSAmIG1hc2spID09IDApOworICAgIH0KKyNlbHNlCisgICAgLyogUmV0dXJucyBub24tc2VjdXJlIHVucHJpdmlsZWdlZCBhY2Nlc3MgKE5TQUNGRykgKi8KKyAgICByZXR1cm4gKCgqKGRldi0+ZGF0YS0+bnNhY2ZnX25zcF9wcGMpICYgbWFzaykgPT0gMCk7CisjZW5kaWYKK30KKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKK2VudW0gcHBjX3BvbGFyaXNfZXJyb3JfdAorcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2LCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90IHNlY19hdHRyKQoreworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gUFBDX1BPTEFSSVNfRVJSX05PVF9JTklUOworICAgIH0KKworICAgIGlmKHNlY19hdHRyID09IFBQQ19QT0xBUklTX1NFQ1VSRV9BQ0NFU1MpIHsKKyAgICAgICAgKihkZXYtPmRhdGEtPnNhY2ZnX25zX3BwYykgJj0gfm1hc2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKihkZXYtPmRhdGEtPnNhY2ZnX25zX3BwYykgfD0gbWFzazsKKyAgICB9CisKKyAgICByZXR1cm4gUFBDX1BPTEFSSVNfRVJSX05PTkU7Cit9CisKK2Jvb2wgcHBjX3BvbGFyaXNfaXNfcGVyaXBoX3NlY3VyZShzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2spCit7CisgICAgaWYoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCAhPSB0cnVlKSB7CisgICAgICAgIC8qIFJldHVybiB0cnVlIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgc2VjdXJlICovCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAoKCooZGV2LT5kYXRhLT5zYWNmZ19uc19wcGMpICYgbWFzaykgPT0gMCk7Cit9CisKK2VudW0gcHBjX3BvbGFyaXNfZXJyb3JfdCBwcGNfcG9sYXJpc19pcnFfZW5hYmxlKHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX2Jsb2NrX3QqIHBfc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcG9sYXJpc19zYWNmZ19ibG9ja190KilkZXYtPmNmZy0+c2FjZmdfYmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gUFBDX1BPTEFSSVNfRVJSX05PVF9JTklUOworICAgIH0KKworICAgIHBfc2FjZmctPnNlY3BwY2ludGVuIHw9IGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrOworCisgICAgcmV0dXJuIFBQQ19QT0xBUklTX0VSUl9OT05FOworfQorCit2b2lkIHBwY19wb2xhcmlzX2lycV9kaXNhYmxlKHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX2Jsb2NrX3QqIHBfc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcG9sYXJpc19zYWNmZ19ibG9ja190KilkZXYtPmNmZy0+c2FjZmdfYmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPT0gdHJ1ZSkgeworICAgICAgICBwX3NhY2ZnLT5zZWNwcGNpbnRlbiAmPSB+KGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrKTsKKyAgICB9Cit9CisKK3ZvaWQgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX2Jsb2NrX3QqIHBfc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcG9sYXJpc19zYWNmZ19ibG9ja190KilkZXYtPmNmZy0+c2FjZmdfYmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPT0gdHJ1ZSkgeworICAgICAgICBwX3NhY2ZnLT5zZWNwcGNpbnRjbHIgPSBkZXYtPmRhdGEtPmludF9iaXRfbWFzazsKKyAgICB9Cit9CisKK2Jvb2wgcHBjX3BvbGFyaXNfaXJxX3N0YXRlKHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX2Jsb2NrX3QqIHBfc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcG9sYXJpc19zYWNmZ19ibG9ja190KilkZXYtPmNmZy0+c2FjZmdfYmFzZTsKKworICAgIGlmKGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgIT0gdHJ1ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICgocF9zYWNmZy0+c2VjcHBjaW50c3RhdCAmIGRldi0+ZGF0YS0+aW50X2JpdF9tYXNrKSAhPSAwKTsKK30KKworI2VuZGlmIC8qIChkZWZpbmVkIChfX0FSTV9GRUFUVVJFX0NNU0UpICYmIChfX0FSTV9GRUFUVVJFX0NNU0UgPT0gM1UpKSAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3BwY19wb2xhcmlzX2Rydi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3BwY19wb2xhcmlzX2Rydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjljN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvcHBjX3BvbGFyaXNfZHJ2LmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogXGZpbGUgcHBjX3BvbGFyaXNfZHJ2LmgKKyAqIFxicmllZiBHZW5lcmljIGRyaXZlciBmb3IgUG9sYXJpcyBQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcnMgKFBQQykuCisgKi8KKworI2lmbmRlZiBfX1BQQ19QT0xBUklTX0RSVl9IX18KKyNkZWZpbmUgX19QUENfUE9MQVJJU19EUlZfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUG9sYXJpcyBQUEMgbmFtZXMgKi8KK2VudW0gcHBjX3BvbGFyaXNfbmFtZV90IHsKKyAgICBQUENfUE9MQVJJU19NQUlOMCA9IDAsICAgICAgICAvKiE8IE1BSU4gUFBDIDAgKi8KKyAgICBQUENfUE9MQVJJU19NQUlOX0VYUDAsICAgICAgICAvKiE8IEV4cGFuc2lvbiAwIE1BSU4gUFBDICovCisgICAgUFBDX1BPTEFSSVNfTUFJTl9FWFAxLCAgICAgICAgLyohPCBFeHBhbnNpb24gMSBNQUlOIFBQQyAqLworICAgIFBQQ19QT0xBUklTX01BSU5fRVhQMiwgICAgICAgIC8qITwgRXhwYW5zaW9uIDIgTUFJTiBQUEMgKi8KKyAgICBQUENfUE9MQVJJU19NQUlOX0VYUDMsICAgICAgICAvKiE8IEV4cGFuc2lvbiAzIE1BSU4gUFBDICovCisgICAgUFBDX1BPTEFSSVNfUEVSSVBIMCwgICAgICAgICAgLyohPCBQRVJJUEggUFBDMCAqLworICAgIFBQQ19QT0xBUklTX1BFUklQSDEsICAgICAgICAgIC8qITwgUEVSSVBIIFBQQzEgKi8KKyAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMCwgICAgICAvKiE8IEV4cGFuc2lvbiAwIFBFUklQSCBQUEMgKi8KKyAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMSwgICAgICAvKiE8IEV4cGFuc2lvbiAxIFBFUklQSCBQUEMgKi8KKyAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMiwgICAgICAvKiE8IEV4cGFuc2lvbiAyIFBFUklQSCBQUEMgKi8KKyAgICBQUENfUE9MQVJJU19QRVJJUEhfRVhQMywgICAgICAvKiE8IEV4cGFuc2lvbiAzIFBFUklQSCBQUEMgKi8KKyAgICBQT0xBUklTX1BQQ19NQVhfTlVNCit9OworCisvKiBQb2xhcmlzIFBQQyBkZXZpY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwcGNfcG9sYXJpc19kZXZfY2ZnX3QgeworICAgIHVpbnQzMl90IGNvbnN0IHNhY2ZnX2Jhc2U7ICAvKiE8IFNlY3VyZSBQcml2aWxlZ2UgQ29udHJvbCBCbG9jayBiYXNlICovCisgICAgdWludDMyX3QgY29uc3QgbnNhY2ZnX2Jhc2U7IC8qITwgTm9uLVNlY3VyZSBQcml2aWxlZ2UgQ29udHJvbCBCbG9jayBiYXNlICovCisgICAgZW51bSBwcGNfcG9sYXJpc19uYW1lX3QgcHBjX25hbWU7Cit9OworCisvKiBQb2xhcmlzIFBQQyBkZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBwcGNfcG9sYXJpc19kZXZfZGF0YV90IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCogc2FjZmdfbnNfcHBjOyAgIC8qITwgUG9pbnRlciB0byBub24tc2VjdXJlIHJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QqIHNhY2ZnX3NwX3BwYzsgICAvKiE8IFBvaW50ZXIgdG8gc2VjdXJlIHVucHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCogbnNhY2ZnX25zcF9wcGM7IC8qITwgUG9pbnRlciB0byBub24tc2VjdXJlIHVucHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCBpbnRfYml0X21hc2s7ICAgICAgICAgICAgICAvKiE8IEludGVycnVwdCBiaXQgbWFzayAqLworICAgIGJvb2wgaXNfaW5pdGlhbGl6ZWQ7ICAgICAgICAgICAgICAgIC8qITwgSW5kaWNhdGVzIGlmIHRoZSBQUEMgZHJpdmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbml0aWFsaXplZCAqLworfTsKKworLyogUG9sYXJpcyBQUEMgZGV2aWNlIHN0cnVjdHVyZSAqLworc3RydWN0IHBwY19wb2xhcmlzX2Rldl90IHsKKyAgICBjb25zdCBzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X2NmZ190KiBjb25zdCBjZmc7ICAvKiE8IFBQQyBjb25maWd1cmF0aW9uICovCisgICAgc3RydWN0IHBwY19wb2xhcmlzX2Rldl9kYXRhX3QqIGNvbnN0IGRhdGE7ICAgICAgLyohPCBQUEMgZGF0YSAqLworfTsKKworLyogU2VjdXJpdHkgYXR0cmlidXRlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwZXJpcGhlcmFscyAqLworZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90IHsKKyAgICBQUENfUE9MQVJJU19TRUNVUkVfQUNDRVNTID0gMCwgICAgLyohIFNlY3VyZSBhY2Nlc3MgKi8KKyAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQUNDRVNTLCAgICAgLyohIE5vbi1zZWN1cmUgYWNjZXNzICovCit9OworCisvKiBQcml2aWxlZ2UgYXR0cmlidXRlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwZXJpcGhlcmFscyAqLworZW51bSBwcGNfcG9sYXJpc19wcml2X2F0dHJfdCB7CisgICAgUFBDX1BPTEFSSVNfUFJJVl9BTkRfTk9OUFJJVl9BQ0NFU1MgPSAwLCAvKiEgUHJpdmlsZWdlIGFuZCBOb25Qcml2aWxlZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyAqLworICAgIFBQQ19QT0xBUklTX1BSSVZfT05MWV9BQ0NFU1MsICAgICAgICAgICAgLyohIFByaXZpbGVnZSBvbmx5IGFjY2VzcyAqLworfTsKKworLyogQVJNIFBQQyBlcnJvciBjb2RlcyAqLworZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHsKKyAgICBQUENfUE9MQVJJU19FUlJfTk9ORSA9IDAsICAgICAgLyohPCBObyBlcnJvciAqLworICAgIFBQQ19QT0xBUklTX0VSUl9JTlZBTElEX1BBUkFNLCAvKiE8IFBQQyBpbnZhbGlkIHBhcmFtZXRlciBlcnJvciAqLworICAgIFBQQ19QT0xBUklTX0VSUl9OT1RfSU5JVCwgICAgICAvKiE8IFBQQyBub3QgaW5pdGlhbGl6ZWQgKi8KKyAgICBQUENfUE9MQVJJU19FUlJfTk9UX1BFUk1JVFRFRCAgLyohPCBQUEMgT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQgKi8KK307CisKKy8qKgorICogXGJyaWVmIEluaXRpYWxpemUgdGhlIFBQQyBkZXZpY2UuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgUFBDIGRldmljZSBccmVmIHBwY19wb2xhcmlzX2Rldl90CisgKgorICogXHJldHVybiBSZXR1cm5zIGVycm9yIGNvZGUgYXMgc3BlY2lmaWVkIGluIFxyZWYgcHBjX3BvbGFyaXNfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBwcGNfcG9sYXJpc19lcnJvcl90IHBwY19wb2xhcmlzX2luaXQoc3RydWN0IHBwY19wb2xhcmlzX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBDb25maWd1cmVzIHByaXZpbGVnZSBhdHRyaWJ1dGUgdGhyb3VnaCB0aGUgUFBDIGRldmljZS4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgICAgICAgUFBDIGRldmljZSBccmVmIHBwY19wb2xhcmlzX2Rldl90CisgKiBccGFyYW1baW5dIG1hc2sgICAgICAgUGVyaXBoZXJhbCBtYXNrIGZvciB0aGUgUFBDLgorICogXHBhcmFtW2luXSBzZWNfYXR0ciAgIFNlY3VyZSBhdHRyaWJ1dGUgdmFsdWUuCisgKiBccGFyYW1baW5dIHByaXZfYXR0ciAgUHJpdmlsZWdlIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBwcGNfcG9sYXJpc19lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QKK3BwY19wb2xhcmlzX2NvbmZpZ19wcml2aWxlZ2Uoc3RydWN0IHBwY19wb2xhcmlzX2Rldl90KiBkZXYsIHVpbnQzMl90IG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90IHNlY19hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcHBjX3BvbGFyaXNfcHJpdl9hdHRyX3QgcHJpdl9hdHRyKTsKKworLyoqCisgKiBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBwZXJpcGhlcmFsIGlzIGNvbmZpZ3VyZWQgYXMgUHJpdmlsZWdlIG9ubHkgb3IKKyAqICAgICAgICBQcml2aWxlZ2UgYW5kIG5vbi1Qcml2aWxlZ2UgYWNjZXNzIG1vZGUuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgIFBQQyBkZXZpY2UgXHJlZiBwcGNfcG9sYXJpc19kZXZfdAorICogXHBhcmFtW2luXSBtYXNrICAgIFBlcmlwaGVyYWwgbWFzayBmb3IgdGhlIFBQQy4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgdHJ1ZSBmb3IgUHJpdmlsZWdlIG9ubHkgY29uZmlndXJhdGlvbiBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgKiAgICAgICAgICAgLSB3aXRoIG5vbi1zZWN1cmUgY2FsbGVyIGluIHRoZSBub24tc2VjdXJlIGRvbWFpbgorICogICAgICAgICAgIC0gd2l0aCBzZWN1cmUgY2FsbGVyIGluIHRoZSBjb25maWd1cmVkIHNlY3VyaXR5IGRvbWFpbgorICogICAgICAgICBJZiB0aGUgZHJpdmVyIGlzIG5vdCBpbml0YWxpemVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpcworICogICAgICAgICB0cnVlIChQcml2aWxlZ2Ugb25seSkgYXMgaXQgaXMgdGhlIGRlZmF1bHQgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9wcml2X29ubHkoc3RydWN0IHBwY19wb2xhcmlzX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrKTsKKworLyogU2VjdXJlIG9ubHkgZnVuY3Rpb25zICovCisjaWYgKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpCisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZXMgc2VjdXJpdHkgYXR0cmlidXRlIHRocm91Z2ggdGhlIFBQQyBkZXZpY2UuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgIFBQQyBkZXZpY2UgXHJlZiBwcGNfcG9sYXJpc19kZXZfdAorICogXHBhcmFtW2luXSBtYXNrICAgICAgIFBlcmlwaGVyYWwgbWFzayBmb3IgdGhlIFBQQy4KKyAqIFxwYXJhbVtpbl0gc2VjX2F0dHIgICBTZWN1cmUgYXR0cmlidXRlIHZhbHVlLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIHBwY19wb2xhcmlzX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gcHBjX3BvbGFyaXNfZXJyb3JfdAorcHBjX3BvbGFyaXNfY29uZmlnX3NlY3VyaXR5KHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2LCB1aW50MzJfdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwcGNfcG9sYXJpc19zZWNfYXR0cl90IHNlY19hdHRyKTsKKworLyoqCisgKiBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBwZXJpcGhlcmFsIGlzIGNvbmZpZ3VyZWQgYXMgc2VjdXJlIG9yIG5vbi1zZWN1cmUuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgIFBQQyBkZXZpY2UgXHJlZiBwcGNfcG9sYXJpc19kZXZfdAorICogXHBhcmFtW2luXSBtYXNrICAgIFBlcmlwaGVyYWwgbWFzayBmb3IgdGhlIFBQQy4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgdHJ1ZSBmb3Igc2VjdXJlIGFuZCBmYWxzZSBmb3Igbm9uLXNlY3VyZS4KKyAqICAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBub3QgaW5pdGFsaXplZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUgKHNlY3VyZSkgYXMKKyAqICAgICAgICAgaXQgaXMgdGhlIGRlZmF1bHQgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHBwY19wb2xhcmlzX2lzX3BlcmlwaF9zZWN1cmUoc3RydWN0IHBwY19wb2xhcmlzX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrKTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyBQUEMgaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBQUEMgZGV2aWNlIFxyZWYgcHBjX3BvbGFyaXNfZGV2X3QKKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiBwcGNfcG9sYXJpc19lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHBwY19wb2xhcmlzX2Vycm9yX3QgcHBjX3BvbGFyaXNfaXJxX2VuYWJsZShzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIERpc2FibGVzIFBQQyBpbnRlcnJ1cHQuCisgKgorICogXHBhcmFtW2luXSBkZXYgIFBQQyBkZXZpY2UgXHJlZiBwcGNfcG9sYXJpc19kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBwcGNfcG9sYXJpc19pcnFfZGlzYWJsZShzdHJ1Y3QgcHBjX3BvbGFyaXNfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIENsZWFycyBQUEMgaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBQUEMgZGV2aWNlIFxyZWYgcHBjX3BvbGFyaXNfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgcHBjX3BvbGFyaXNfY2xlYXJfaXJxKHN0cnVjdCBwcGNfcG9sYXJpc19kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUmV0dXJucyB0aGUgUFBDIGludGVycnVwdCBzdGF0ZS4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgUFBDIGRldmljZSBccmVmIHBwY19wb2xhcmlzX2Rldl90CisgKgorICogXHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGludGVycnVwdCBpcyBhY3RpdmUgYW5kIG90aGVyd2lzZSBmYWxzZS4KKyAqICAgICAgICAgSWYgdGhlIGRyaXZlciBpcyBub3QgaW5pdGFsaXplZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMKKyAqICAgICAgICAgZmFsc2UgKG5vdCBhY3RpdmUpIGFzIGl0IGlzIHRoZSBkZWZhdWx0IHN5c3RlbSBjb25maWd1cmF0aW9uLgorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBwcGNfcG9sYXJpc19pcnFfc3RhdGUoc3RydWN0IHBwY19wb2xhcmlzX2Rldl90KiBkZXYpOworCisjZW5kaWYgLyogKGRlZmluZWQgKF9fQVJNX0ZFQVRVUkVfQ01TRSkgJiYgKF9fQVJNX0ZFQVRVUkVfQ01TRSA9PSAzVSkpICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogX19QUENfUE9MQVJJU19EUlZfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvc3lzY291bnRlcl9hcm12OC1tX2NudHJsX2Rydi5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3N5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJiYjAyCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3N5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuYwpAQCAtMCwwICsxLDQ4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOSBBcm0gTGltaXRlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogXGZpbGUgc3lzY291bnRlcl9hcm12OC1tX2NudHJsX2Rydi5jCisgKgorICogXGJyaWVmIERyaXZlciBmb3IgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sLCBjb3ZlcmluZyBDTlRDb250cm9sQmFzZQorICogICAgICAgIEZyYW1lCisgKgorICogVGhpcyBTeXN0ZW0gQ291bnRlciBpcyBhIDY0LWJpdCB1cC1jb3VudGVyLCBnZW5lcmF0aW5nIHRoZSBwaHlzaWNhbAorICogY291bnQgZm9yIFN5c3RlbSBUaW1lci4KKyAqCisgKiBNYWluIGZlYXR1cmVzOgorICogICAtIEVuYWJsZWQvZGlzYWJsZSBhbmQgU2V0L0dldCB0aGUgNjQtYml0IHVwY291bnRlcgorICogICAtIDIgc2NhbGluZyByZWdpc3RlciBmb3IgdGhlIDIgY2xvY2sgc291cmNlcworICogICAgICAgLSBUaGVzZSByZWdpc3RlcnMgYXJlIHVzZWQgdG8gcHJlLXByb2dyYW0gdGhlIHNjYWxpbmcgdmFsdWVzIHNvCisgKiAgICAgICAgICB0aGF0IHdoZW4gaGFyZHdhcmUgYmFzZWQgY2xvY2sgc3dpdGNoaW5nIGlzIGltcGxlbWVudGVkIHRoZXJlIGlzIG5vCisgKiAgICAgICAgICBuZWVkIHRvIHByb2dyYW0gdGhlIHNjYWxpbmcgaW5jcmVtZW50IHZhbHVlIGVhY2ggdGltZSB3aGVuIGNsb2NrIGlzCisgKiAgICAgICAgICBzd2l0Y2hlZC4KKyAqICAgICAgICAtIFdoZW4gY291bnRlciBzY2FsaW5nIGlzIGVuYWJsZWQsIFNjYWxlVmFsIGlzIHRoZSBhbW91bnQgYWRkZWQgdG8gdGhlCisgKiAgICAgICAgICBDb3VudGVyIENvdW50IFZhbHVlIGZvciBldmVyeSBwZXJpb2Qgb2YgdGhlIGNvdW50ZXIgYXMgZGV0ZXJtaW5lZAorICogICAgICAgICAgYnkgMS9GcmVxdWVuY3kgZnJvbSB0aGUgY3VycmVudCBvcGVyYXRpbmcgZnJlcXVlbmN5IG9mIHRoZSBzeXN0ZW0KKyAqICAgICAgICAgIGNvdW50ZXIgKHRoZSCTY291bnRlciB0aWNrlCkuCisgKiAgICAgICAgLSBTY2FsZVZhbCBpcyBleHByZXNzZWQgYXMgYW4gdW5zaWduZWQgZml4ZWQtcG9pbnQgbnVtYmVyIHdpdGgKKyAqICAgICAgICAgIGEgOCBiaXQgaW50ZWdlciB2YWx1ZSBhbmQgYSAyNC1iaXQgZnJhY3Rpb25hbCB2YWx1ZQorICogICAtIEludGVycnVwdCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisgKiAgICAgICBUaGVyZSBhcmUgMiBwb3NzaWJsZSByZWFzb25zIGZvciBlcnJvciBub3RpZmljYXRpb24gZ2VuZXJhdGlvbiBmcm9tCisgKiAgICAgICB0aGUgQ291bnRlcjoKKyAqICAgICAgICAgMS4gU2VjdXJpdHkgYXR0cmlidXRlIG1pc21hdGNoIGJldHdlZW4gcmVnaXN0ZXIgYWNjZXNzIGFuZCBzZWN1cml0eQorICogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIENPTlRST0wgZnJhbWUKKyAqICAgICAgICAgMi4gQWRkcmVzcyBkZWNvZGUgZXJyb3Igd2l0aGluIGEgZ2l2ZW4gZnJhbWUKKyAqCisgKi8KKworI2luY2x1ZGUgInN5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuaCIKKworLyoqIFNldHRlciBiaXQgbWFuaXB1bGF0aW9uIG1hY3JvICovCisjZGVmaW5lIFNFVF9CSVQoV09SRCwgQklUX0lOREVYKSAoKFdPUkQpIHw9ICgxVSA8PCAoQklUX0lOREVYKSkpCisvKiogQ2xlYXJpbmcgYml0IG1hbmlwdWxhdGlvbiBtYWNybyAqLworI2RlZmluZSBDTFJfQklUKFdPUkQsIEJJVF9JTkRFWCkgKChXT1JEKSAmPSB+KDFVIDw8IChCSVRfSU5ERVgpKSkKKy8qKiBHZXR0ZXIgYml0IG1hbmlwdWxhdGlvbiBtYWNybyAqLworI2RlZmluZSBHRVRfQklUKFdPUkQsIEJJVF9JTkRFWCkgKGJvb2wpKCgoV09SRCkgJiAoMVUgPDwgKEJJVF9JTkRFWCkpKSkKKy8qKiBDbGVhci1hbmQtU2V0IGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQVNTSUdOX0JJVChXT1JELCBCSVRfSU5ERVgsIFZBTFVFKSBcCisgICAgICAgICAgICAoV09SRCA9ICgoV09SRCAmIH4oMVUgPDwgKEJJVF9JTkRFWCkpKSB8IChWQUxVRSA8PCAoQklUX0lOREVYKSkpKQorLyoqIEdldHRlciBiaXQtZmllbGQgbWFuaXB1bGF0aW9uIG1hY3JvICovCisjZGVmaW5lIEdFVF9CSVRfRklFTEQoV09SRCwgQklUX01BU0ssIEJJVF9PRkZTRVQpIFwKKyAgICAgICAgICAgICgoV09SRCAmIEJJVF9NQVNLKSA+PiBCSVRfT0ZGU0VUKQorLyoqIEJpdCBtYXNrIGZvciBnaXZlbiB3aWR0aCBiaXQtZmllbGQgbWFuaXB1bGF0aW9uIG1hY3JvICovCisjZGVmaW5lIEJJVE1BU0sod2lkdGgpICgoMXU8PCh3aWR0aCkpLTEpCisKKy8qKgorICogXGJyaWVmIENOVENvbnRyb2xCYXNlIFJlZ2lzdGVyIG1hcCBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjbnRjcjsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDAwIChSL1cpIENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHNyOworICAgICAgICAvKiE8IE9mZnNldDogMHgwMDQgKFJPKSBDb3VudGVyIFN0YXR1cyBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudGN2X2xvdzsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDA4IChSL1cpIENvdW50ZXIgQ291bnQgVmFsdWUgWzMxOjBdIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY250Y3ZfaGlnaDsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDBDIChSL1cpIENvdW50ZXIgQ291bnQgVmFsdWUgWzYzOjMyXSBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudHNjcjsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDEwIChSL1cpIENvdW50ZXIgU2NhbGUgUmVnaXN0ZXIKKyAgICAgICAgICogICBBbGlhc2VkIHdpdGggQ05UU0NSMCwgbWVhbmluZyB0aGF0IGVpdGhlciBhZGRyZXNzZXMgb2YgQ05UU0NSIGFuZAorICAgICAgICAgKiAgIENOVFNDUjAgd2lsbCBwaHlzaWNhbGx5IGFjY2VzcyBhIHNpbmdsZSByZWdpc3RlcgorICAgICAgICAgKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCByZXNlcnZlZDBbMl07CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAxNC0weDAxOCBSZXNlcnZlZCAoUkFaV0kpICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250aWQ7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAxQyAoUk8pIENvdW50ZXIgSUQgUmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCByZXNlcnZlZDFbNDBdOworICAgICAgICAvKiE8IE9mZnNldDogMHgwMjAtMHgwQkMgUmVzZXJ2ZWQgKFJBWldJKSAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkMls0XTsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MEMwLTB4MENDIFJlc2VydmVkIChSQVpXSSkgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjbnRzY3IwOworICAgICAgICAvKiE8IE9mZnNldDogMHgwRDAgKFIvVykgQ291bnRlciBTY2FsZSBSZWdpc3RlciAwICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY250c2NyMTsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MEQ0IChSL1cpIENvdW50ZXIgU2NhbGUgUmVnaXN0ZXIgMSAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkM1s5NThdOworICAgICAgICAvKiE8IE9mZnNldDogMHgwRDgtMHhGQ0MgUmVzZXJ2ZWQgKFJBWldJKSAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBpZHI0OworICAgICAgICAvKiE8IE9mZnNldDogMHhGRDAgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgcmVzZXJ2ZWQ0WzNdOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRDQtMHhGREMgUmVzZXJ2ZWQgKFJBWldJKSAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBpZHIwOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRTAgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cGlkcjE7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweEZFNCAoUk8pIFBlcmlwaGVyYWwgSUQgUmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRwaWRyMjsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkU4IChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBpZHIzOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRUMgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250Y2lkcjA7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweEZGMCAoUk8pIENvbXBvbmVudCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudGNpZHIxOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRjQgKFJPKSBDb21wb25lbnQgSUQgUmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRjaWRyMjsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkY4IChSTykgQ29tcG9uZW50IElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250Y2lkcjM7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweEZGQyAoUk8pIENvbXBvbmVudCBJRCBSZWdpc3RlciAqLworfTsKKworLyoqCisgKiBcYnJpZWYgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIGJpdCBmaWVsZHMKKyAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYgICAgICAgICAgICAgMHUKKyAgICAvKiE8IENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciBFbmFibGUgQ291bnRlciBiaXQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0hEQkdfT0ZGICAgICAgICAgICAxdQorICAgIC8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIEhhbHQgT24gRGVidWcgYml0IGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9TQ0VOX09GRiAgICAgICAgICAgMnUKKyAgICAvKiE8IENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciBTY2FsZSBlbmFibGUgYml0IGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9JTlRSTUFTS19PRkYgICAgICAgM3UKKyAgICAvKiE8IENvdW50ZXIgQ29udHJvbCBSZWdpc3RlciBJbnRlcnJ1cHQgbWFzayBiaXQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1BTTFZFUlJESVNfT0ZGICAgICA0dQorICAgIC8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIFBTTFZFUlIgZGlzYWJsZSBiaXQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0lOVFJDTFJfT0ZGICAgICAgICA1dQorICAgIC8qITwgQ291bnRlciBDb250cm9sIFJlZ2lzdGVyIEludGVycnVwdCBDbGVhciBiaXQgZmllbGQgb2Zmc2V0ICovCisKKy8qKgorICogXGJyaWVmIENvdW50ZXIgU3RhdHVzIFJlZ2lzdGVyIGJpdCBmaWVsZHMKKyAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRTUl9EQkdIX09GRiAgICAgICAgICAgMXUKKyAgICAvKiE8IENvdW50ZXIgU3RhdHVzIFJlZ2lzdGVyIEhhbHQtb24tRGVidWcgYml0IGZpZWxkIG9mZnNldCAqLworCisvKioKKyAqIFxicmllZiBDb3VudGVyIElEIFJlZ2lzdGVyIGJpdCBmaWVsZHMKKyAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTQ19PRkYgICAgICAgICAgICAgICAgICAwdQorICAgIC8qITwgQ291bnRlciBJRCBSZWdpc3RlciBDb3VudGVyIFNjYWxpbmcgaXMgaW1wbGVtZW50ZWQgYml0IGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRDU19PRkYgICAgICAgICAgICAgICAgICAxNnUKKyAgICAvKiE8IENvdW50ZXIgSUQgUmVnaXN0ZXIgQ2xvY2sgc3dpdGNoaW5nIGlzIGltcGxlbWVudGVkIGJpdCBmaWVsZCBvZmZzZXQgKi8KKworLyohIENvdW50ZXIgSUQgUmVnaXN0ZXIgQ2xvY2sgc291cmNlICovCisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNFTENMS19PRkYgICAgICAgICAgICAgIDE3dQorI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfV0lEVEggICAgICAgICAgICAydQorI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfTUFTSyAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQklUTUFTSyhTWVNDT1VOVEVSX0FSTVY4TV9DTlRJRF9DTlRTRUxDTEtfV0lEVEgpIFwKKyAgICAgICAgICAgIDw8IFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNFTENMS19PRkYpCisKKyNkZWZpbmUgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0NSX09WUl9PRkYgICAgICAgICAgICAgMTl1CisgICAgLyohPCBDb3VudGVyIElEIFJlZ2lzdGVyIE92ZXJyaWRlIGNvdW50ZXIgZW5hYmxlIGNvbmRpdGlvbiBmb3IKKyAgICAgKiAgIHdyaXRpbmcgdG8gQ05UU0NSIHJlZ2lzdGVycyBiaXQgb2Zmc2V0CisgICAgICovCisKK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Vycm9yX3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2luaXQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lcnJvcl90IHJlc3VsdCA9IFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORTsKKworICAgIGlmIChkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkID09IGZhbHNlKSB7CisgICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2NvdW50ZXIoZGV2KTsKKyAgICAgICAgaWYgKHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX3NjYWxpbmdfaW1wbGVtZW50ZWQoZGV2KSkgeworICAgICAgICAgICAgcmVzdWx0ID0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NldF9jb3VudGVyX3NjYWxlX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgZGV2LCBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfTlJfMCwgZGV2LT5jZmctPnNjYWxlMCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2V0X2NvdW50ZXJfc2NhbGVfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICBkZXYsIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9OUl8xLCBkZXYtPmNmZy0+c2NhbGUxKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9OT05FKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2V0X2NvdW50ZXJfdmFsdWUoZGV2LAorICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOF9NX0RFRkFVTFRfSU5JVF9DTlRfVkFMKTsKKyAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rpc2FibGVfaW50ZXJydXB0KGRldik7CisgICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX3NjYWxlKGRldik7CisKKyAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2VuYWJsZV9jb3VudGVyKGRldik7CisgICAgICAgIGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9OT05FOworfQorCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF91bmluaXQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBpZiAoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9PSB0cnVlKSB7CisgICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2NvdW50ZXIoZGV2KTsKKyAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rpc2FibGVfaW50ZXJydXB0KGRldik7CisgICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zZXRfY291bnRlcl92YWx1ZShkZXYsCisgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOF9NX0RFRkFVTFRfSU5JVF9DTlRfVkFMKTsKKyAgICAgICAgZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZW5hYmxlX2NvdW50ZXIoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIFNFVF9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYpOworfQorCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2NvdW50ZXIoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIENMUl9CSVQocF9jbnQtPmNudGNyLCBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYpOworfQorCitib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9FTl9PRkYpOworfQorCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfaGFsdF9vbl9kZWJ1ZygKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgU0VUX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0hEQkdfT0ZGKTsKK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9oYWx0X29uX2RlYnVnKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBDTFJfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSERCR19PRkYpOworfQorCitib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19oYWx0X29uX2RlYnVnX2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9IREJHX09GRik7Cit9CisKK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2VuYWJsZV9zY2FsZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgU0VUX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1NDRU5fT0ZGKTsKK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9zY2FsZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgQ0xSX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1NDRU5fT0ZGKTsKK30KKworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfc2NhbGVfZW5hYmxlZCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgcmV0dXJuIEdFVF9CSVQocF9jbnQtPmNudGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1NDRU5fT0ZGKTsKK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZW5hYmxlX2ludGVycnVwdCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgU0VUX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0lOVFJNQVNLX09GRik7Cit9CisKK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rpc2FibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBDTFJfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfSU5UUk1BU0tfT0ZGKTsKK30KKworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfaW50ZXJydXB0X2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9JTlRSTUFTS19PRkYpOworfQorCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfcHNsdmVycigKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgU0VUX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX1BTTFZFUlJESVNfT0ZGKTsKK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9wc2x2ZXJyKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBDTFJfQklUKHBfY250LT5jbnRjciwgU1lTQ09VTlRFUl9BUk1WOE1fQ05UQ1JfUFNMVkVSUkRJU19PRkYpOworfQorCitib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19wc2x2ZXJyX2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4TV9DTlRDUl9QU0xWRVJSRElTX09GRik7Cit9CisKK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2NsZWFyX2ludGVycnVwdCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgQ0xSX0JJVChwX2NudC0+Y250Y3IsIFNZU0NPVU5URVJfQVJNVjhNX0NOVENSX0lOVFJDTFJfT0ZGKTsKK30KKworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY291bnRlcl9oYWx0ZWRfb25fZGVidWcoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRzciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4TV9DTlRTUl9EQkdIX09GRik7Cit9CisKK3VpbnQ2NF90IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY291bnRlcl92YWx1ZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgdWludDMyX3QgaGlnaCA9IDA7CisgICAgdWludDMyX3QgbG93ID0gMDsKKyAgICB1aW50MzJfdCBoaWdoX3ByZXYgPSAwOworICAgIHVpbnQ2NF90IHZhbHVlID0gMDsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgNjQtYml0IHJlYWQgd2lsbCBiZSBhdG9taWMgdG8gYXZvaWQgb3ZlcmZsb3cgYmV0d2VlbgorICAgICAqIHRoZSBsb3cgYW5kIGhpZ2ggcmVnaXN0ZXJzIHJlYWQKKyAgICAgKi8KKyAgICBoaWdoID0gcF9jbnQtPmNudGN2X2hpZ2g7CisgICAgZG8geworICAgICAgICBoaWdoX3ByZXYgPSBoaWdoOworICAgICAgICBsb3cgPSBwX2NudC0+Y250Y3ZfbG93OworICAgICAgICBoaWdoID0gcF9jbnQtPmNudGN2X2hpZ2g7CisgICAgfXdoaWxlKGhpZ2ggIT0gaGlnaF9wcmV2KTsKKworICAgIHZhbHVlID0gbG93IHwKKyAgICAgICAgICAgICgoKHVpbnQ2NF90KWhpZ2gpIDw8IFNZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9SRUdJU1RFUl9CSVRfV0lEVEgpOworICAgIHJldHVybiB2YWx1ZTsKK30KKwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2V0X2NvdW50ZXJfdmFsdWUoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldiwKKyAgICAgICAgdWludDY0X3QgdmFsdWUpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBwX2NudC0+Y250Y3ZfbG93ID0gdmFsdWUgJiBVSU5UMzJfTUFYOworICAgIHBfY250LT5jbnRjdl9oaWdoID0gdmFsdWUgPj4gU1lTQ09VTlRFUl9BUk1WOF9NX0NOVFJMX1JFR0lTVEVSX0JJVF9XSURUSDsKK30KKworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY291bnRlcl9zY2FsaW5nX2ltcGxlbWVudGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0NfT0ZGKTsKK30KKworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY2xvY2tfc3dpdGNoaW5nX2ltcGxlbWVudGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UQ1NfT0ZGKTsKK30KKworZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2VsY2xrX3QKK3N5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY2xvY2tfc291cmNlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9jb250cm9sX2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gKGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NlbGNsa190KQorICAgICAgICAgICAgR0VUX0JJVF9GSUVMRChwX2NudC0+Y250aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0VMQ0xLX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOE1fQ05USURfQ05UU0VMQ0xLX09GRik7Cit9CisKK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2NudHNjcl9vdnJfdAorc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2dldF9vdmVycmlkZV9jbnRzY3IoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiAoZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfY250c2NyX292cl90KQorICAgICAgICAgICAgR0VUX0JJVChwX2NudC0+Y250aWQsCisgICAgICAgICAgICAgICAgICAgIFNZU0NPVU5URVJfQVJNVjhNX0NOVElEX0NOVFNDUl9PVlJfT0ZGKTsKK30KKworZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdAorc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2dldF9jb3VudGVyX3NjYWxlX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYsCisgICAgICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX25yX3QgbnIsCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2NhbGVfdmFsX3QgKnZhbCkKK3sKKyAgICBzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2NvbnRyb2xfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgc3dpdGNoIChucikgeworICAgIGNhc2UgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzA6CisgICAgICAgIHZhbC0+aW50ZWdlciA9IHBfY250LT5jbnRzY3IwID4+IFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfSU5UX09GRjsKKyAgICAgICAgdmFsLT5maXhlZF9wb2ludF9mcmFjdGlvbiA9IHBfY250LT5jbnRzY3IwICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfTlJfMToKKyAgICAgICAgdmFsLT5pbnRlZ2VyID0gcF9jbnQtPmNudHNjcjEgPj4gU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfT0ZGOworICAgICAgICB2YWwtPmZpeGVkX3BvaW50X2ZyYWN0aW9uID0gcF9jbnQtPmNudHNjcjEgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfRlJBQ1RfTUFYOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB2YWwtPmludGVnZXIgPSAwOworICAgICAgICB2YWwtPmZpeGVkX3BvaW50X2ZyYWN0aW9uID0gMDsKKyAgICAgICAgcmV0dXJuIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfSU5WQUxJRF9BUkc7CisgICAgfQorCisgICAgcmV0dXJuIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORTsKK30KKworZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdAorc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NldF9jb3VudGVyX3NjYWxlX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYsCisgICAgICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX25yX3QgbnIsCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2NhbGVfdmFsX3QgdmFsKQoreworICAgIHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfY29udHJvbF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgdWludDMyX3QgcmVnX3ZhbCA9IDA7CisKKyAgICBpZiAoKHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfb3ZlcnJpZGVfY250c2NyKGRldikgPT0KKyAgICAgICAgU1lTQ09VTlRFUl9BUk1WOF9NX0NOVFNDUl9JRl9ESVNBQkxFRCkgJiYKKyAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX2NvdW50ZXJfZW5hYmxlZChkZXYpKSB7CisgICAgICAgIHJldHVybiBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX0lOVkFMSUQ7CisgICAgfQorICAgIGlmICh2YWwuaW50ZWdlciA+IFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfSU5UX01BWCB8fAorICAgICAgICB2YWwuZml4ZWRfcG9pbnRfZnJhY3Rpb24gPiBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0ZSQUNUX01BWCkgeworICAgICAgICByZXR1cm4gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9JTlZBTElEX0FSRzsKKyAgICB9CisKKyAgICByZWdfdmFsID0gdmFsLmludGVnZXIgPDwgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfT0ZGOworICAgIHJlZ192YWwgfD0gKHZhbC5maXhlZF9wb2ludF9mcmFjdGlvbiAmCisgICAgICAgICAgICAgICAgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9GUkFDVF9NQVgpOworCisgICAgc3dpdGNoIChucikgeworICAgIGNhc2UgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzA6CisgICAgICAgIHBfY250LT5jbnRzY3IwID0gcmVnX3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfTlJfMToKKyAgICAgICAgcF9jbnQtPmNudHNjcjEgPSByZWdfdmFsOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9JTlZBTElEX0FSRzsKKyAgICB9CisKKyAgICByZXR1cm4gU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9OT05FOworfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3N5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9zeXNjb3VudGVyX2FybXY4LW1fY250cmxfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0Nzg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9zeXNjb3VudGVyX2FybXY4LW1fY250cmxfZHJ2LmgKQEAgLTAsMCArMSw1MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTkgQXJtIExpbWl0ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFxmaWxlIHN5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuaAorICoKKyAqIFxicmllZiBEcml2ZXIgZm9yIEFybXY4LU0gU3lzdGVtIENvdW50ZXIgQ29udHJvbCwgY292ZXJpbmcgQ05UQ29udHJvbEJhc2UKKyAqICAgICAgICBGcmFtZQorICoKKyAqIFRoaXMgU3lzdGVtIENvdW50ZXIgaXMgYSA2NC1iaXQgdXAtY291bnRlciwgZ2VuZXJhdGluZyB0aGUgcGh5c2ljYWwKKyAqIGNvdW50IGZvciBTeXN0ZW0gVGltZXIuCisgKgorICogTWFpbiBmZWF0dXJlczoKKyAqICAgLSBFbmFibGUvZGlzYWJsZSBhbmQgU2V0L0dldCB0aGUgNjQtYml0IHVwY291bnRlcgorICogICAtIDIgc2NhbGluZyByZWdpc3RlcnMgZm9yIHRoZSAyIGNsb2NrIHNvdXJjZXMKKyAqICAgICAgIC0gVGhlc2UgcmVnaXN0ZXJzIGFyZSB1c2VkIHRvIHByZS1wcm9ncmFtIHRoZSBzY2FsaW5nIHZhbHVlcyBzbworICogICAgICAgICAgdGhhdCB3aGVuIGhhcmR3YXJlIGJhc2VkIGNsb2NrIHN3aXRjaGluZyBpcyBpbXBsZW1lbnRlZCB0aGVyZSBpcyBubworICogICAgICAgICAgbmVlZCB0byBwcm9ncmFtIHRoZSBzY2FsaW5nIGluY3JlbWVudCB2YWx1ZSBlYWNoIHRpbWUgd2hlbiBjbG9jayBpcworICogICAgICAgICAgc3dpdGNoZWQuCisgKiAgICAgICAgLSBXaGVuIGNvdW50ZXIgc2NhbGluZyBpcyBlbmFibGVkLCBTY2FsZVZhbCBpcyB0aGUgdmFsdWUgYWRkZWQgdG8gdGhlCisgKiAgICAgICAgICBDb3VudGVyIENvdW50IFZhbHVlIGZvciBldmVyeSBwZXJpb2Qgb2YgdGhlIGNvdW50ZXIgYXMgZGV0ZXJtaW5lZAorICogICAgICAgICAgYnkgMS9GcmVxdWVuY3kgZnJvbSB0aGUgY3VycmVudCBvcGVyYXRpbmcgZnJlcXVlbmN5IG9mIHRoZSBzeXN0ZW0KKyAqICAgICAgICAgIGNvdW50ZXIgKHRoZSCTY291bnRlciB0aWNrlCkuCisgKiAgICAgICAgLSBTY2FsZVZhbCBpcyBleHByZXNzZWQgYXMgYW4gdW5zaWduZWQgZml4ZWQtcG9pbnQgbnVtYmVyIHdpdGgKKyAqICAgICAgICAgIGEgOCBiaXQgaW50ZWdlciB2YWx1ZSBhbmQgYSAyNC1iaXQgZnJhY3Rpb25hbCB2YWx1ZQorICogICAtIEludGVycnVwdCBmb3IgZXJyb3IgZGV0ZWN0aW9uCisgKiAgICAgICBUaGVyZSBhcmUgMiBwb3NzaWJsZSByZWFzb25zIGZvciBlcnJvciBub3RpZmljYXRpb24gZ2VuZXJhdGlvbiBmcm9tCisgKiAgICAgICB0aGUgQ291bnRlcjoKKyAqICAgICAgICAgMS4gU2VjdXJpdHkgYXR0cmlidXRlIG1pc21hdGNoIGJldHdlZW4gcmVnaXN0ZXIgYWNjZXNzIGFuZCBzZWN1cml0eQorICogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIENPTlRST0wgZnJhbWUKKyAqICAgICAgICAgMi4gQWRkcmVzcyBkZWNvZGUgZXJyb3Igd2l0aGluIGEgZ2l2ZW4gZnJhbWUKKyAqCisgKi8KKworI2lmbmRlZiBfX1NZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9EUlZfSF9fCisjZGVmaW5lIF9fU1lTQ09VTlRFUl9BUk1WOF9NX0NOVFJMX0RSVl9IX18KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9SRUdJU1RFUl9CSVRfV0lEVEggICAgIDMydQorICAgIC8qITwgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sIHJlZ2lzdGVycyBiaXQgd2lkdGggKi8KKworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fREVGQVVMVF9JTklUX0NOVF9WQUwgICAgICAgICAwdQorICAgIC8qITwgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sIGRlZmF1bHQgY291bnRlciBpbml0IHZhbHVlICovCisKKy8qKgorICogXGJyaWVmIEFybXY4LU0gU3lzdGVtIENvdW50ZXIgQ29udHJvbCBzY2FsaW5nIHZhbHVlCisgKi8KK3N0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2NhbGVfdmFsX3QgeworICAgIHVpbnQzMl90IGludGVnZXI7ICAgICAgICAgICAgICAvKiA4IGJpdCAqLworICAgIHVpbnQzMl90IGZpeGVkX3BvaW50X2ZyYWN0aW9uOyAvKiAyNCBiaXQgKi8KK307CisKKy8qKgorICogXGJyaWVmIEFybXY4LU0gU3lzdGVtIENvdW50ZXIgQ29udHJvbCBzY2FsaW5nIHZhbHVlIG1hY3JvcyAqCisgKiAgICAgICAgOCBiaXQgaW50ZWdlciBhbmQgMjQgYml0IGZpeGVkIHBvaW50IGZyYWN0aW9uYWwgdmFsdWUKKyAqLworI2RlZmluZSBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfVkFMX0lOVF9NQVggICAgICBVSU5UOF9NQVgKKyNkZWZpbmUgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfT0ZGICAgICAgMjR1CisjZGVmaW5lIFNZU0NPVU5URVJfQVJNVjhfTV9TQ0FMRV9WQUxfRlJBQ1RfTUFYICAgIFwKKyAgICAgICAgICAgICgoMXUgPDwgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX1ZBTF9JTlRfT0ZGKSAtIDF1KQorCisvKioKKyAqICBcYnJpZWYgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl9jZmdfdCB7CisgICAgY29uc3QgdWludDMyX3QgYmFzZTsKKyAgICAgICAgLyohPCBBcm12OC1NIFN5c3RlbSBDb3VudGVyIENvbnRyb2wgZGV2aWNlIGJhc2UgYWRkcmVzcyAqLworICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2NhbGVfdmFsX3Qgc2NhbGUwOworICAgICAgICAvKiE8IERlZmF1bHQgY2xvY2sgc2NhbGluZyB2YWx1ZSBmb3IgQ2xvY2sgc291cmNlIDAgKi8KKyAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX3ZhbF90IHNjYWxlMTsKKyAgICAgICAgLyohPCBEZWZhdWx0IGNsb2NrIHNjYWxpbmcgdmFsdWUgZm9yIENsb2NrIHNvdXJjZSAxICovCit9OworCisvKioKKyAqIFxicmllZiBBcm12OC1NIFN5c3RlbSBDb3VudGVyIENvbnRyb2wgZGV2aWNlIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X2RhdGFfdCB7CisgICAgYm9vbCBpc19pbml0aWFsaXplZDsKK307CisKKy8qKgorICogXGJyaWVmIEFybXY4LU0gU3lzdGVtIENvdW50ZXIgQ29udHJvbCBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QgeworICAgIGNvbnN0IHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X2NmZ190KiBjb25zdCBjZmc7CisgICAgICAgIC8qITwgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCisgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfZGF0YV90KiBjb25zdCBkYXRhOworICAgICAgICAvKiE8IEFybXY4LU0gU3lzdGVtIENvdW50ZXIgQ29udHJvbCBkYXRhIHN0cnVjdHVyZSAqLworfTsKKworLyoqCisgKiBcYnJpZWYgQXJtdjgtTSBTeXN0ZW0gQ291bnRlciBDb250cm9sIGVycm9yIGVudW1lcmF0aW9uIHR5cGVzCisgKi8KK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Vycm9yX3QgeworICAgIFNZU0NPVU5URVJfQVJNVjhfTV9FUlJfTk9ORSAgICAgICAgID0gMHUsCisgICAgU1lTQ09VTlRFUl9BUk1WOF9NX0VSUl9JTlZBTElEICAgICAgPSAxdSwKKyAgICBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX0lOVkFMSURfQVJHICA9IDJ1Cit9OworCisvKioKKyAqIFxicmllZiBBcm12OC1NIFN5c3RlbSBDb3VudGVyIENvbnRyb2wgc2NhbGluZyBudW1iZXIgZm9yIGVhY2ggY2xvY2sgc291cmNlcworICovCitlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zY2FsZV9ucl90IHsKKyAgICBTWVNDT1VOVEVSX0FSTVY4X01fU0NBTEVfTlJfMCAgICAgICAgID0gMHUsCisgICAgICAvKiE8IFNjYWxpbmcgZm9yIFxyZWYgU1lTQ09VTlRFUl9BUk1WOF9NX1NFTENMS19DTEswICovCisgICAgU1lTQ09VTlRFUl9BUk1WOF9NX1NDQUxFX05SXzEgICAgICAgICA9IDF1CisgICAgICAvKiE8IFNjYWxpbmcgZm9yIFxyZWYgU1lTQ09VTlRFUl9BUk1WOF9NX1NFTENMS19DTEsxICovCit9OworCisvKioKKyAqIFxicmllZiBDbG9jayBzZWxlY3QgdmFsdWVzCisgKi8KK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NlbGNsa190IHsKKyAgICBTWVNDT1VOVEVSX0FSTVY4X01fU0VMQ0xLX0NMS19JTlZBTElEMCAgPSAwdSwKKyAgICAgICAgLyohPCBDbG9jayBzZWxlY3QgaW52YWxpZCB2YWx1ZSAqLworICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TRUxDTEtfQ0xLMCAgICAgICAgICA9IDF1LAorICAgICAgICAvKiE8IENsb2NrIHNlbGVjdCBjbG9jayBzb3VyY2UgMCAqLworICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TRUxDTEtfQ0xLMSAgICAgICAgICA9IDJ1LAorICAgICAgICAvKiE8IENsb2NrIHNlbGVjdCBjbG9jayBzb3VyY2UgMSAqLworICAgIFNZU0NPVU5URVJfQVJNVjhfTV9TRUxDTEtfQ0xLX0lOVkFMSUQxICA9IDN1CisgICAgICAgIC8qITwgQ2xvY2sgc2VsZWN0IGludmFsaWQgdmFsdWUgKi8KK307CisKKy8qKgorICogXGJyaWVmIE92ZXJyaWRlIGNvdW50ZXIgZW5hYmxlIGNvbmRpdGlvbiBmb3Igd3JpdGluZyB0byBDTlRTQ1IgcmVnaXN0ZXJzCisgKgorICovCitlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9jbnRzY3Jfb3ZyX3QgeworICAgIFNZU0NPVU5URVJfQVJNVjhfTV9DTlRTQ1JfSUZfRElTQUJMRUQgICA9IDB1LAorICAgIC8qITwgU2NhbGluZyByZWdpc3RlcnMgY2FuIGJlIHdyaXR0ZW4gb25seSB3aGVuIGNvdW50ZXIgaXMgZGlzYWJsZWQgKi8KKyAgICBTWVNDT1VOVEVSX0FSTVY4X01fQ05UU0NSX0FMV0FZUyAgICAgICAgPSAxdQorICAgIC8qITwgQ05UU0NSIGNhbiBiZSB3cml0dGVuIHJlZ2FyZGxlc3Mgb2YgY291bnRlciBlbmFibGVkIG9yIGRpc2FibGVkICovCit9OworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplcyBjb3VudGVyIHRvIGEga25vd24gZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXM6CisgKiAgICAgICAgICAtIGNvdW50ZXIgaXMgZW5hYmxlZCwgc28gc3RhcnRzIGNvdW50aW5nCisgKiAgICAgICAgICAtIGludGVycnVwdCBpcyBkaXNhYmxlZAorICogICAgICAgICAgLSBjb3VudGVyIHJlc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWUKKyAqICAgICAgICAgICAgICBccmVmIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX0lOSVRfQ05UX1ZBTAorICogICAgICAgICAgLSBzY2FsaW5nIGlzIGRpc2FibGVkCisgKiAgICAgICAgICAtIHNjYWxpbmcgcmVnaXN0ZXJzIGFyZSBzZXQgdG8gdGhlIHNldCB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgXHJlZiBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl9jZmdfdAorICogICAgICAgIEluaXQgc2hvdWxkIGJlIGNhbGxlZCBwcmlvciB0byBhbnkgb3RoZXIgcHJvY2VzcyBhbmQKKyAqICAgICAgICBpdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmb2xsb3cgcHJvcGVyIGNhbGwgb3JkZXIuCisgKiAgICAgICAgTW9yZSB0aGFuIG9uZSBjYWxsIHJlc3VsdHMgZmFsbCB0aHJvdWdoLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gRXJyb3Igc3RhdHVzIFxyZWYgZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaW5pdCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgVW5pbml0aWFsaXplcyBjb3VudGVyIHRvIGEga25vd24gZGVmYXVsdCBzdGF0ZSwgd2hpY2ggaXM6CisgKiAgICAgICAgICAtIGNvdW50ZXIgaXMgZGlzYWJsZWQsIHNvIHN0b3BzIGNvdW50aW5nCisgKiAgICAgICAgICAtIGludGVycnVwdCBpcyBkaXNhYmxlZAorICogICAgICAgICAgLSBjb3VudGVyIHJlc2V0IHRvIGRlZmF1bHQgcmVzZXQgdmFsdWUKKyAqICAgICAgICAgICAgICBccmVmIFNZU0NPVU5URVJfQVJNVjhfTV9ERUZBVUxUX0lOSVRfQ05UX1ZBTAorICogICAgICAgICAgLSBzY2FsaW5nIGlzIGRpc2FibGVkCisgKiAgICAgICAgSW5pdCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIGFueSBvdGhlciBwcm9jZXNzIGFuZAorICogICAgICAgIGl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZvbGxvdyBwcm9wZXIgY2FsbCBvcmRlci4KKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3VuaW5pdCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyB0aGUgY291bnRlciwgc28gY291bnRlciBzdGFydHMgY291bnRpbmcKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2VuYWJsZV9jb3VudGVyKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBEaXNhYmxlcyB0aGUgY291bnRlciwgc28gY291bnRlciBzdG9wcyBjb3VudGluZworICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9jb3VudGVyKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyBjb3VudGVyIGVuYWJsZSBzdGF0dXMKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19jb3VudGVyX2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgSGFsdC1Pbi1EZWJ1ZyBmZWF0dXJlCisgKgorICogXHBhcmFtW2luXSBkZXYgQ291bnRlciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfaGFsdF9vbl9kZWJ1ZygKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRGlzYWJsZXMgSGFsdC1Pbi1EZWJ1ZyBmZWF0dXJlCisgKgorICogXHBhcmFtW2luXSBkZXYgQ291bnRlciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kaXNhYmxlX2hhbHRfb25fZGVidWcoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFBvbGxzIEhhbHQtT24tRGVidWcgZW5hYmxlbWVudCBzdGF0dXMKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKworICogXHJldHVybiB0cnVlIGlmIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfaGFsdF9vbl9kZWJ1Z19lbmFibGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBFbmFibGVzIHNjYWxpbmcKKyAqICAgICAgICBUaGUgdXNlZCBzY2FsaW5nIHJlZ2lzdGVyIGlzIGRlcGVuZGluZyBvbiB0aGUgdXNlZCBIVyBjbG9jayBzb3VyY2UuCisgKgorICogXHBhcmFtW2luXSBkZXYgQ291bnRlciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfc2NhbGUoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIERpc2FibGVzIHNjYWxpbmcKKyAqICAgICAgICBDb3VudGVyIGNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkgZGVmYXVsdCAxIGZvciBlYWNoIHRpY2tzLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9zY2FsZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUG9sbHMgc2NhbGluZyBlbmFibGVtZW50IHN0YXR1cworICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2Jvb2wgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX3NjYWxlX2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgaW50ZXJydXB0CisgKgorICogIFRoZXJlIGFyZSAyIHBvc3NpYmxlIHJlYXNvbnMgZm9yIGVycm9yIG5vdGlmaWNhdGlvbiBnZW5lcmF0aW9uIGZyb20KKyAqICB0aGUgQ291bnRlcjoKKyAqICAgMS4gU2VjdXJpdHkgYXR0cmlidXRlIG1pc21hdGNoIGJldHdlZW4gcmVnaXN0ZXIgYWNjZXNzIGFuZCBzZWN1cml0eQorICogICAgICAgYXR0cmlidXRlIG9mIHRoZSBDT05UUk9MIGZyYW1lCisgKiAgIDIuIEFkZHJlc3MgZGVjb2RlIGVycm9yIHdpdGhpbiBhIGdpdmVuIGZyYW1lCisgKgorICogXHBhcmFtW2luXSBkZXYgQ291bnRlciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9lbmFibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBEaXNhYmxlcyBpbnRlcnJ1cHQKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rpc2FibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyBpbnRlcnJ1cHQgZW5hYmxlbWVudCBzdGF0dXMKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pc19pbnRlcnJ1cHRfZW5hYmxlZCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyBQU0xWRVJSIG91dHB1dAorICoKKyAqICAgICAgICBQU0xWRVJSIG91dHB1dCBzaWduYWwgb24gQVBCIGJ1cyBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZm9yIHRoZQorICogICAgICAgIGZvbGxvd2luZyBlcnJvcjoKKyAqICAgICAgICAgIEZvciBzZWN1cml0eSBhdHRyaWJ1dGUgbWlzbWF0Y2ggYmV0d2VlbiByZWdpc3RlciBhY2Nlc3MgYW5kIHNlY3VyaXR5CisgKiAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlIENPTlRST0wgZnJhbWUKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2VuYWJsZV9wc2x2ZXJyKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBEaXNhYmxlcyBQU0xWRVJSIG91dHB1dAorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGlzYWJsZV9wc2x2ZXJyKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyBQU0xWRVJSIG91dHB1dCBlbmFibGVtZW50IHN0YXR1cworICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gdHJ1ZSBpZiBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2Jvb2wgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX3BzbHZlcnJfZW5hYmxlZCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgQ2xlYXJzIGludGVycnVwdCBwZW5kaW5nIGZsYWcKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2NsZWFyX2ludGVycnVwdCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUG9sbHMgSGFsdC1Pbi1EZWJ1ZyBzdGF0dXMKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgY291bnRlciBpcyBoYWx0ZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY291bnRlcl9oYWx0ZWRfb25fZGVidWcoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFJlYWQgY291bnRlciB2YWx1ZQorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gNjQgYml0IGNvdW50ZXIgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQ2NF90IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY291bnRlcl92YWx1ZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGVzIGNvdW50ZXIgdmFsdWUKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqIFxwYXJhbVtpbl0gdmFsdWUgNjQgYml0IGNvdW50ZXIgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NldF9jb3VudGVyX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYsCisgICAgICAgIHVpbnQ2NF90IHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgUG9sbHMgd2hldGhlciBzY2FsaW5nIGlzIGltcGxlbWVudGVkCisgKgorICogXHBhcmFtW2luXSBkZXYgQ291bnRlciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90CisgKgorICogXHJldHVybiB0cnVlIGlmIGltcGxlbWVudGVkLCBmYWxzZSBvdGhlcndpc2UKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2Jvb2wgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2lzX2NvdW50ZXJfc2NhbGluZ19pbXBsZW1lbnRlZCgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUG9sbHMgd2hldGhlciBIVyBiYXNlZCBjbG9jayBzd2l0Y2hpbmcgaXMgaW1wbGVtZW50ZWQKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgaW1wbGVtZW50ZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfaXNfY2xvY2tfc3dpdGNoaW5nX2ltcGxlbWVudGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBSZWFkcyB3aGljaCBjbG9jayBzb3VyY2UgaXMgYmVpbmcgdXNlZAorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gQ2xvY2sgc291cmNlIFxyZWYgZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2VsY2xrX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NlbGNsa190CisgICAgICAgIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY2xvY2tfc291cmNlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBSZWFkcyBzY2FsaW5nIHJlZ2lzdGVyIGNhbiBiZSBvdmVycmlkZW4gYW55dGltZQorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICoKKyAqIFxyZXR1cm4gT3ZlcnJpZGUgY29uZGl0aW9uIFxyZWYgZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfY250c2NyX292cl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9jbnRzY3Jfb3ZyX3QKKyAgICAgICAgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2dldF9vdmVycmlkZV9jbnRzY3IoCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFJlYWRzIHNjYWxpbmcgcmVnaXN0ZXIKKyAqCisgKiBccGFyYW1baW5dIGRldiBDb3VudGVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZGV2X3QKKyAqIFxwYXJhbVtpbl0gbnIgSW5kZXggb2Ygc2NhbGluZyByZWdpc3RlciB0byByZWFkCisgKiAgICAgICAgICAgICAgXHJlZiBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zY2FsZV9ucl90CisgKiBccGFyYW1bb3V0XSBuciBQb2ludGVyIHRvIHN0cnVjdHVyZSB0byByZWFkIHRoZSBzY2FsZSB2YWx1ZQorICogICAgICAgICAgICAgICAgXHJlZiBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX3ZhbF90CisgKgorICogXHJldHVybiBPdmVycmlkZSBjb25kaXRpb24gXHJlZiBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9jbnRzY3Jfb3ZyX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Vycm9yX3QKK3N5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9nZXRfY291bnRlcl9zY2FsZV92YWx1ZSgKKyAgICAgICAgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdCogZGV2LAorICAgICAgICBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zY2FsZV9ucl90IG5yLAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX3ZhbF90ICp2YWwpOworCisvKioKKyAqIFxicmllZiBXcml0ZXMgc2NhbGluZyByZWdpc3RlcgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IENvdW50ZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9kZXZfdAorICogXHBhcmFtW2luXSBuciBJbmRleCBvZiBzY2FsaW5nIHJlZ2lzdGVyIHRvIHdyaXRlCisgKiAgICAgICAgICAgICAgXHJlZiBlbnVtIHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zY2FsZV9ucl90CisgKiBccGFyYW1baW5dIFNjYWxlIHZhbHVlIHN0cnVjdHVyZQorICogICAgICAgICAgICAgIFxyZWYgc3RydWN0IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9zY2FsZV92YWxfdAorICoKKyAqIFxyZXR1cm4gRXJyb3Igc3RhdHVzIFxyZWYgZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworZW51bSBzeXNjb3VudGVyX2FybXY4X21fY250cmxfZXJyb3JfdAorc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NldF9jb3VudGVyX3NjYWxlX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Rldl90KiBkZXYsCisgICAgICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX3NjYWxlX25yX3QgbnIsCisgICAgICAgIHN0cnVjdCBzeXNjb3VudGVyX2FybXY4X21fY250cmxfc2NhbGVfdmFsX3QgdmFsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfX1NZU0NPVU5URVJfQVJNVjhfTV9DTlRSTF9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvc3lzdGltZXJfYXJtdjgtbV9kcnYuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9zeXN0aW1lcl9hcm12OC1tX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YjRiMTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvc3lzdGltZXJfYXJtdjgtbV9kcnYuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOS0yMDIwIEFybSBMaW1pdGVkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBzeXN0aW1lcl9hcm12OC1tX2Rydi5jCisgKgorICogXGJyaWVmIERyaXZlciBmb3IgQXJtdjgtTSBTeXN0ZW0gVGltZXIKKyAqCisgKi8KKworI2luY2x1ZGUgInN5c3RpbWVyX2FybXY4LW1fZHJ2LmgiCisKKy8qKiBTZXR0ZXIgYml0IG1hbmlwdWxhdGlvbiBtYWNybyAqLworI2RlZmluZSBTRVRfQklUKFdPUkQsIEJJVF9JTkRFWCkgKChXT1JEKSB8PSAoMXUgPDwgKEJJVF9JTkRFWCkpKQorLyoqIENsZWFyaW5nIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQ0xSX0JJVChXT1JELCBCSVRfSU5ERVgpICgoV09SRCkgJj0gfigxdSA8PCAoQklUX0lOREVYKSkpCisvKiogR2V0dGVyIGJpdCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgR0VUX0JJVChXT1JELCBCSVRfSU5ERVgpIChib29sKSgoKFdPUkQpICYgKDF1IDw8IChCSVRfSU5ERVgpKSkpCisvKiogR2V0dGVyIGJpdC1maWVsZCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgR0VUX0JJVF9GSUVMRChXT1JELCBCSVRfTUFTSywgQklUX09GRlNFVCkgXAorICAgICAgICAgICAgKChXT1JEICYgQklUX01BU0spID4+IEJJVF9PRkZTRVQpCisvKiogQml0IG1hc2sgZm9yIGdpdmVuIHdpZHRoIGJpdC1maWVsZCBtYW5pcHVsYXRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQklUTUFTSyh3aWR0aCkgKCgxdTw8KHdpZHRoKSktMSkKKworLyoqCisgKiBcYnJpZWYgQ05UQmFzZSBSZWdpc3RlciBtYXAgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QgeworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBjdF9sb3c7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAwMCAoUk8pIEN1cnJlbnQgUGh5c2ljYWwgQ291bnRlciBWYWx1ZSBbMzE6MF0gKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRwY3RfaGlnaDsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDA0IChSTykgQ3VycmVudCBQaHlzaWNhbCBDb3VudGVyIFZhbHVlIFs2MzozMl0gKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCByZXNlcnZlZDBbMl07CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAwOC0weDBDIFJlc2VydmVkICAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudGZycTsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDEwIChSL1cpIENvdW50ZXIgRnJlcXVlbmN5IHJlZ2lzdGVyIGluIEh6ICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgcmVzZXJ2ZWQxWzNdOworICAgICAgICAvKiE8IE9mZnNldDogMHgwMTQtMHgwMUMgUmVzZXJ2ZWQgICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY250cF9jdmFsX2xvdzsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDIwIChSL1cpIFRpbWVyIENvbXBhcmUgVmFsdWUgcmVnaXN0ZXIgWzMxOjBdICovCisgICAgdm9sYXRpbGUgdWludDMyX3QgY250cF9jdmFsX2hpZ2g7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAyNCAoUi9XKSBUaW1lciBDb21wYXJlIFZhbHVlIHJlZ2lzdGVyIFs2MzozMl0gKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBjbnRwX3R2YWw7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDAyOCAoUi9XKSBUaW1lciBWYWx1ZSByZWdpc3RlciAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudHBfY3RsOworICAgICAgICAvKiE8IE9mZnNldDogMHgwMkMgKFIvVykgVGltZXIgQ29udHJvbCByZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkMls0XTsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDMwLTB4MDNDIFJlc2VydmVkICAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfYWl2YWxfbG93OworICAgICAgICAvKiE8IE9mZnNldDogMHgwNDAgKFJPKSBBdXRvIEluY3JlbWVudCBWYWx1ZSByZWdpc3RlciBbMzE6MF0qLworICAgIHZvbGF0aWxlIGNvbnN0ICB1aW50MzJfdCBjbnRwX2FpdmFsX2hpZ2g7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweDA0NCAoUk8pIEF1dG8gSW5jcmVtZW50IFZhbHVlIHJlZ2lzdGVyIFs2MzozMl0qLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudHBfYWl2YWxfcmVsb2FkOworICAgICAgICAvKiE8IE9mZnNldDogMHgwNDggKFIvVykgQXV0byBJbmNyZW1lbnQgVmFsdWUgUmVsb2FkIHJlZ2lzdGVyIFs2MzozMl0qLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGNudHBfYWl2YWxfY3RsOworICAgICAgICAvKiE8IE9mZnNldDogMHgwNEMgKFIvVykgQXV0byBJbmNyZW1lbnQgQ29udHJvbCByZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0ICB1aW50MzJfdCBjbnRwX2NmZzsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4MDUwIChSTykgVGltZXIgQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IHJlc2VydmVkM1s5OTFdOworICAgICAgICAvKiE8IE9mZnNldDogMHgwNTQtMHhGQ0MgUmVzZXJ2ZWQgICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cF9waWQ0OworICAgICAgICAvKiE8IE9mZnNldDogMHhGRDAgKFJPKSBQZXJpcGhlcmFsIElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgcmVzZXJ2ZWQ0WzNdOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRDQtMHhGREMgUmVzZXJ2ZWQgKFJBWldJKSAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfcGlkMDsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkUwIChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfcGlkMTsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkU0IChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfcGlkMjsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkU4IChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfcGlkMzsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkVDIChSTykgUGVyaXBoZXJhbCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfY2lkMDsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkYwIChSTykgQ29tcG9uZW50IElEIFJlZ2lzdGVyICovCisgICAgdm9sYXRpbGUgY29uc3QgdWludDMyX3QgY250cF9jaWQxOworICAgICAgICAvKiE8IE9mZnNldDogMHhGRjQgKFJPKSBDb21wb25lbnQgSUQgUmVnaXN0ZXIgKi8KKyAgICB2b2xhdGlsZSBjb25zdCB1aW50MzJfdCBjbnRwX2NpZDI7CisgICAgICAgIC8qITwgT2Zmc2V0OiAweEZGOCAoUk8pIENvbXBvbmVudCBJRCBSZWdpc3RlciAqLworICAgIHZvbGF0aWxlIGNvbnN0IHVpbnQzMl90IGNudHBfY2lkMzsKKyAgICAgICAgLyohPCBPZmZzZXQ6IDB4RkZDIChSTykgQ29tcG9uZW50IElEIFJlZ2lzdGVyICovCit9OworCisvKioKKyAqIFxicmllZiBUaW1lciBDb250cm9sIFJlZ2lzdGVyIGJpdCBmaWVsZHMKKyAqLworI2RlZmluZSBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQ1RMX0VOX09GRiAgICAgICAgICAgMHUKKyAgICAvKiE8IFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgRW5hYmxlIENvdW50ZXIgYml0IGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQ1RMX0lNQVNLX09GRiAgICAgICAgMXUKKy8qITwgVGltZXIgQ29udHJvbCBSZWdpc3RlciBJbnRlcnJ1cHQgTWFzayBiaXQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9DVExfSVNUQVRVU19PRkYgICAgICAydQorLyohPCBUaW1lciBDb250cm9sIFJlZ2lzdGVyIEludGVycnVwdCBTdGF0dXMgYml0IGZpZWxkIG9mZnNldCAqLworCisvKioKKyAqIFxicmllZiBUaW1lciBBdXRvSW5jIENvbnRyb2wgUmVnaXN0ZXIgYml0IGZpZWxkcworICovCisjZGVmaW5lIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9BSVZBTF9DVExfRU5fT0ZGICAgICAgICAgICAwdQorICAgIC8qITwgVGltZXIgQ29udHJvbCBSZWdpc3RlciBFbmFibGUgQ291bnRlciBiaXQgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9BSVZBTF9DVExfSVJRX0NMUl9PRkYgICAgICAxdQorLyohPCBUaW1lciBDb250cm9sIFJlZ2lzdGVyIEludGVycnVwdCBjbGVhciBiaXQgZmllbGQgb2Zmc2V0ICovCisKKy8qKgorICogXGJyaWVmIFRpbWVyIEF1dG9JbmMgQ29uZmlnIFJlZ2lzdGVyIGJpdCBmaWVsZHMKKyAqLworI2RlZmluZSBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQ0ZHX0NUTF9BVVRPSU5DX09GRiAgICAgICAgMHUKKyAgICAvKiE8IFRpbWVyIENvbnRyb2wgUmVnaXN0ZXIgQXV0b0luYyBpcyBpbXBsZW1lbnRlZCBiaXQgZmllbGQgb2Zmc2V0ICovCisKKwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2luaXQoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldikKK3sKKyAgICBpZiAoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9PSBmYWxzZSkgeworICAgICAgICBzeXN0aW1lcl9hcm12OF9tX2Rpc2FibGVfaW50ZXJydXB0KGRldik7CisgICAgICAgIHN5c3RpbWVyX2FybXY4X21fZGlzYWJsZV9hdXRvaW5jKGRldik7CisgICAgICAgIHN5c3RpbWVyX2FybXY4X21fc2V0X2NvdW50ZXJfZnJlcShkZXYsIGRldi0+Y2ZnLT5kZWZhdWx0X2ZyZXFfaHopOworICAgICAgICBzeXN0aW1lcl9hcm12OF9tX2VuYWJsZV90aW1lcihkZXYpOworICAgICAgICBkZXYtPmRhdGEtPmlzX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV91bmluaXQoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldikKK3sKKyAgICBpZiAoZGV2LT5kYXRhLT5pc19pbml0aWFsaXplZCA9PSB0cnVlKSB7CisgICAgICAgIHN5c3RpbWVyX2FybXY4X21fZGlzYWJsZV9pbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgc3lzdGltZXJfYXJtdjhfbV9kaXNhYmxlX2F1dG9pbmMoZGV2KTsKKyAgICAgICAgc3lzdGltZXJfYXJtdjhfbV9kaXNhYmxlX3RpbWVyKGRldik7CisgICAgICAgIGRldi0+ZGF0YS0+aXNfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3VpbnQ2NF90IHN5c3RpbWVyX2FybXY4X21fZ2V0X2NvdW50ZXJfdmFsdWUoCisgICAgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHVpbnQzMl90IGhpZ2ggPSAwOworICAgIHVpbnQzMl90IGxvdyA9IDA7CisgICAgdWludDMyX3QgaGlnaF9wcmV2ID0gMDsKKyAgICB1aW50NjRfdCB2YWx1ZSA9IDA7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIDY0LWJpdCByZWFkIHdpbGwgYmUgYXRvbWljIHRvIGF2b2lkIG92ZXJmbG93IGJldHdlZW4KKyAgICAgKiB0aGUgbG93IGFuZCBoaWdoIHJlZ2lzdGVycyByZWFkCisgICAgICovCisgICAgaGlnaCA9IHBfY250LT5jbnRwY3RfaGlnaDsKKyAgICBkbyB7CisgICAgICAgIGhpZ2hfcHJldiA9IGhpZ2g7CisgICAgICAgIGxvdyA9IHBfY250LT5jbnRwY3RfbG93OworICAgICAgICBoaWdoID0gcF9jbnQtPmNudHBjdF9oaWdoOworICAgIH13aGlsZShoaWdoICE9IGhpZ2hfcHJldik7CisKKyAgICB2YWx1ZSA9IGxvdyB8ICgoKHVpbnQ2NF90KWhpZ2gpIDw8IFNZU1RJTUVSX0FSTVY4X01fUkVHSVNURVJfQklUX1dJRFRIKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9zZXRfY29tcGFyZV92YWx1ZSgKKyAgICAgICAgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldiwKKyAgICAgICAgdWludDY0X3QgdmFsdWUpCit7CisgICAgc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHBfY250LT5jbnRwX2N2YWxfbG93ID0gdmFsdWUgJiBVSU5UMzJfTUFYOworICAgIHBfY250LT5jbnRwX2N2YWxfaGlnaCA9IHZhbHVlID4+IFNZU1RJTUVSX0FSTVY4X01fUkVHSVNURVJfQklUX1dJRFRIOworfQorCit1aW50NjRfdCBzeXN0aW1lcl9hcm12OF9tX2dldF9jb21wYXJlX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHVpbnQ2NF90IHZhbHVlID0gMDsKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgdmFsdWUgPSBwX2NudC0+Y250cF9jdmFsX2xvdyB8CisgICAgICAgICAgICAoKCh1aW50NjRfdClwX2NudC0+Y250cF9jdmFsX2hpZ2gpIDw8CisgICAgICAgICAgICAgICAgICAgIFNZU1RJTUVSX0FSTVY4X01fUkVHSVNURVJfQklUX1dJRFRIKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9zZXRfY291bnRlcl9mcmVxKHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgcF9jbnQtPmNudGZycSA9IHZhbHVlOworfQorCit1aW50MzJfdCBzeXN0aW1lcl9hcm12OF9tX2dldF9jb3VudGVyX2ZyZXEoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBwX2NudC0+Y250ZnJxOworfQorCit2b2lkIHN5c3RpbWVyX2FybXY4X21fc2V0X3RpbWVyX3ZhbHVlKHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBwX2NudC0+Y250cF90dmFsID0gdmFsdWU7Cit9CisKK3VpbnQzMl90IHN5c3RpbWVyX2FybXY4X21fZ2V0X3RpbWVyX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gcF9jbnQtPmNudHBfdHZhbDsKK30KKwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2VuYWJsZV90aW1lcihzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBTRVRfQklUKHBfY250LT5jbnRwX2N0bCwgU1lTQ1RJTUVSX0FSTVY4TV9DTlRQX0NUTF9FTl9PRkYpOworfQorCit2b2lkIHN5c3RpbWVyX2FybXY4X21fZGlzYWJsZV90aW1lcihzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBDTFJfQklUKHBfY250LT5jbnRwX2N0bCwgU1lTQ1RJTUVSX0FSTVY4TV9DTlRQX0NUTF9FTl9PRkYpOworfQorCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfdGltZXJfZW5hYmxlZCgKKyAgICAgICAgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgcmV0dXJuIEdFVF9CSVQocF9jbnQtPmNudHBfY3RsLCBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQ1RMX0VOX09GRik7Cit9CisKK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9lbmFibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICAvKiBUaGUgYml0IGlzIG1hc2tpbmcgaW50ZXJydXB0LCBzbyBpdCBzaG91bGQgYmUgaW52ZXJ0ZWQuICovCisgICAgQ0xSX0JJVChwX2NudC0+Y250cF9jdGwsIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9DVExfSU1BU0tfT0ZGKTsKK30KKwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2Rpc2FibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICAvKiBUaGUgYml0IGlzIG1hc2tpbmcgaW50ZXJydXB0LCBzbyBpdCBzaG91bGQgYmUgaW52ZXJ0ZWQuICovCisgICAgU0VUX0JJVChwX2NudC0+Y250cF9jdGwsIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9DVExfSU1BU0tfT0ZGKTsKK30KKworYm9vbCBzeXN0aW1lcl9hcm12OF9tX2lzX2ludGVycnVwdF9lbmFibGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICAvKiBUaGUgYml0IGlzIG1hc2tpbmcgaW50ZXJydXB0LCBzbyBpdCBzaG91bGQgYmUgaW52ZXJ0ZWQuICovCisgICAgcmV0dXJuICFHRVRfQklUKHBfY250LT5jbnRwX2N0bCwgU1lTQ1RJTUVSX0FSTVY4TV9DTlRQX0NUTF9JTUFTS19PRkYpOworfQorCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfaW50ZXJydXB0X2Fzc2VydGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250cF9jdGwsIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9DVExfSVNUQVRVU19PRkYpOworfQorCit1aW50NjRfdCBzeXN0aW1lcl9hcm12OF9tX2dldF9hdXRvaW5jX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHVpbnQ2NF90IHZhbHVlID0gMDsKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgdmFsdWUgPSBwX2NudC0+Y250cF9haXZhbF9sb3cgfAorICAgICAgICAgICAgKCgodWludDY0X3QpcF9jbnQtPmNudHBfYWl2YWxfaGlnaCkgPDwKKyAgICAgICAgICAgICBTWVNUSU1FUl9BUk1WOF9NX1JFR0lTVEVSX0JJVF9XSURUSCk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCit2b2lkIHN5c3RpbWVyX2FybXY4X21fc2V0X2F1dG9pbmNfcmVsb2FkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2LAorICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgcF9jbnQtPmNudHBfYWl2YWxfcmVsb2FkID0gdmFsdWU7Cit9CisKK3VpbnQzMl90IHN5c3RpbWVyX2FybXY4X21fZ2V0X2F1dG9pbmNfcmVsb2FkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gcF9jbnQtPmNudHBfYWl2YWxfcmVsb2FkOworfQorCit2b2lkIHN5c3RpbWVyX2FybXY4X21fZW5hYmxlX2F1dG9pbmMoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KiBwX2NudCA9CisgICAgICAgICAgICAoc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisgICAgU0VUX0JJVChwX2NudC0+Y250cF9haXZhbF9jdGwsIFNZU0NUSU1FUl9BUk1WOE1fQ05UUF9BSVZBTF9DVExfRU5fT0ZGKTsKK30KKwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2Rpc2FibGVfYXV0b2luYyhzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBDTFJfQklUKHBfY250LT5jbnRwX2FpdmFsX2N0bCwgU1lTQ1RJTUVSX0FSTVY4TV9DTlRQX0FJVkFMX0NUTF9FTl9PRkYpOworfQorCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfYXV0b2luY19lbmFibGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqIHBfY250ID0KKyAgICAgICAgICAgIChzdHJ1Y3QgY250X2Jhc2VfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICByZXR1cm4gR0VUX0JJVChwX2NudC0+Y250cF9haXZhbF9jdGwsCisgICAgICAgICAgICAgICAgICAgU1lTQ1RJTUVSX0FSTVY4TV9DTlRQX0FJVkFMX0NUTF9FTl9PRkYpOworfQorCit2b2lkIHN5c3RpbWVyX2FybXY4X21fY2xlYXJfYXV0b2luY19pbnRlcnJ1cHQoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIENMUl9CSVQocF9jbnQtPmNudHBfYWl2YWxfY3RsLCBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQUlWQUxfQ1RMX0lSUV9DTFJfT0ZGKTsKK30KKworYm9vbCBzeXN0aW1lcl9hcm12OF9tX2lzX2F1dG9pbmNfaW1wbGVtZW50ZWQoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IGNudF9iYXNlX3JlZ19tYXBfdCogcF9jbnQgPQorICAgICAgICAgICAgKHN0cnVjdCBjbnRfYmFzZV9yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworICAgIHJldHVybiBHRVRfQklUKHBfY250LT5jbnRwX2NmZywKKyAgICAgICAgICAgICAgICAgICBTWVNDVElNRVJfQVJNVjhNX0NOVFBfQ0ZHX0NUTF9BVVRPSU5DX09GRik7Cit9CisKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9zeXN0aW1lcl9hcm12OC1tX2Rydi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3N5c3RpbWVyX2FybXY4LW1fZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE0ZDJmNwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy9zeXN0aW1lcl9hcm12OC1tX2Rydi5oCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5IEFybSBMaW1pdGVkCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBzeXN0aW1lcl9hcm12OC1tX2Rydi5oCisgKgorICogXGJyaWVmIERyaXZlciBmb3IgQXJtdjgtTSBTeXN0ZW0gVGltZXIKKyAqCisgKiBUaGlzIFN5c3RlbSBUaW1lciBpcyBiYXNlZCBvbiB0aGUgNjQtYml0IEFybXY4LU0gU3lzdGVtIENvdW50ZXIsCisgKiBnZW5lcmF0aW5nIHRoZSBwaHlzaWNhbCBjb3VudCBmb3IgU3lzdGVtIFRpbWVyLgorICoKKyAqIE1haW4gZmVhdHVyZXM6CisgKiAgIC0gRGlzYWJsaW5nIHRoZSB0aW1lciBkb2Vzbid0IHN0b3AgY291bnRpbmcsIGJ1dCBpdCBkaXNhYmxlcyB0aW1lciBvdXRwdXQKKyAqICAgICBzaWduYWwsIHdoYXQgbWlnaHQgYmUgYSBwb3dlciBzYXZpbmcgb3B0aW9uLgorICogICAtIDEgaW50ZXJydXB0IHNpZ25hbCwgY2FuIGJlIHRyaWdnZXJlZCBieSB0aGUgMiBtb2RlcyBiZWxvdworICogICAgICBNb2RlczoKKyAqICAgICAgICAgIDEuIE5vcm1hbCBtb2RlCisgKiAgICAgICAgICBGb3IgY2xlYXJpbmcgdGhlIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgbm9ybWFsIG1vZGUsIHRoZSBUaW1lcgorICogICAgICAgICAgc2hvdWxkIGJlIGRpc2FibGVkLgorICogICAgICAgICAgICAgIFZpZXdzCisgKiAgICAgICAgICAgICAgICAgIDEuMS4gNjQtYml0IHVwLWNvdW50aW5nIENvbXBhcmUgdmlldworICogICAgICAgICAgICAgICAgICAgICAgIEFzIHNvb24gYXMgdGhlIHBoeXNpY2FsIHVwLWNvdW50ZXIgcmVhY2hlcyB0aGUgc2V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZSB2YWx1ZSwgdGhlIGludGVycnVwdCBzdGF0dXMgd2lsbCBiZSBhc3NlcnRlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21fc2V0X2NvbXBhcmVfdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21fZ2V0X2NvbXBhcmVfdmFsdWUKKworICogICAgICAgICAgICAgICAgICAxLjIuIDMyLWJpdCBkb3duLWNvdW50aW5nIFRpbWVyIHZpZXcKKyAqICAgICAgICAgICAgICAgICAgICAgICBBcyBzb29uIGFzIHRoZSBkb3duLWNvdW50ZXIgdGltZXIgcmVhY2hlcyB6ZXJvLAorICogICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHdpbGwgYmUgYXNzZXJ0ZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGUgZG93bi1jb3VudGVyIHRpbWVyIHZhbHVlLCBzZXRzIHRoZSBjb21wYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmUgcmVnaXN0ZXIgPSBjdXJyZW50IGNvdW50ZXIgKyB0aW1lciB2YWx1ZQorICogICAgICAgICAgICAgICAgICAgICAgIFxyZWYgc3lzdGltZXJfYXJtdjhfbV9zZXRfdGltZXJfdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21fZ2V0X3RpbWVyX3ZhbHVlCisgKgorICogICAgICAgICAgMi4gQXV0by1JbmNyZW1lbnQgbW9kZQorICogICAgICAgICAgICAgIC0gVGhlIGF1dG8taW5jcmVtZW50IGZlYXR1cmUgYWxsb3dzIGdlbmVyYXRpb24gb2YgVGltZXIKKyAqICAgICAgICAgICAgICAgIGludGVycnVwdCBhdCByZWd1bGFyIGludGVydmFscyB3aXRob3V0IHRoZSBuZWVkIGZvcgorICogICAgICAgICAgICAgICAgcmVwcm9ncmFtbWluZyB0aGUgVGltZXIgYWZ0ZXIgZWFjaCBpbnRlcnJ1cHQgYW5kIHJlLWVuYWJsaW5nCisgKiAgICAgICAgICAgICAgICB0aGUgdGltZXIgbG9naWMuCisgKiAgICAgICAgICAgICAgLSBBdXRvLWluY3JlbWVudCBpcyB3b3JraW5nIGFzIGEgNjQtYml0IHVwLWNvdW50ZXIsIHdoaWNoIGlzIHNldAorICogICAgICAgICAgICAgICAgYnkgdGhlIDMyLWJpdCByZWxvYWQgcmVnaXN0ZXIuCisgKiAgICAgICAgICAgICAgLSBJZiBhdXRvLWluY3JlbWVudCBtb2RlIGlzIGVuYWJsZWQsIG5vbmUgb2YgdGhlIG5vcm1hbCBtb2RlcycKKyAqICAgICAgICAgICAgICAgIHZpZXdzIGNhbiBhc3NlcnQgaW50ZXJydXB0LiAqCisgKiAgICAgICAgICAgICAgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2dldF9hdXRvaW5jX3ZhbHVlCisgKiAgICAgICAgICAgICAgXHJlZiBzeXN0aW1lcl9hcm12OF9tX3NldF9hdXRvaW5jX3JlbG9hZAorICogICAgICAgICAgICAgIFxyZWYgc3lzdGltZXJfYXJtdjhfbV9lbmFibGVfYXV0b2luYworICogICAgICAgICAgICAgIFxyZWYgc3lzdGltZXJfYXJtdjhfbV9kaXNhYmxlX2F1dG9pbmMKKyAqICAgICAgICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21faXNfYXV0b2luY19lbmFibGVkCisgKiAgICAgICAgICAgICAgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2NsZWFyX2F1dG9pbmNfaW50ZXJydXB0CisgKiAgICAgICAgICAgICAgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2lzX2F1dG9pbmNfaW1wbGVtZW50ZWQKKyAqCisgKi8KKworI2lmbmRlZiBfX1NZU1RJTUVSX0FSTVY4X01fRFJWX0hfXworI2RlZmluZSBfX1NZU1RJTUVSX0FSTVY4X01fRFJWX0hfXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgU1lTVElNRVJfQVJNVjhfTV9SRUdJU1RFUl9CSVRfV0lEVEggICAgICAgICAgMzJ1CisgICAgLyohPCBBcm12OC1NIFN5c3RlbSBUaW1lciByZWdpc3RlcnMgYml0IHdpZHRoICovCisKKy8qKgorICogIFxicmllZiBBcm12OC1NIFN5c3RlbSBUaW1lciBkZXZpY2UgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X2NmZ190IHsKKyAgICBjb25zdCB1aW50MzJfdCBiYXNlOworICAgICAgICAvKiE8IEFybXY4LU0gU3lzdGVtIFRpbWVyIGRldmljZSBiYXNlIGFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCBkZWZhdWx0X2ZyZXFfaHo7CisgICAgICAgIC8qITwgRGVmYXVsdCByZXBvcnRlZCBmcmVxdWVuY3kgaW4gSHogKi8KK307CisKKy8qKgorICogXGJyaWVmIEFybXY4LU0gU3lzdGVtIFRpbWVyIGRldmljZSBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfZGF0YV90IHsKKyAgICBib29sIGlzX2luaXRpYWxpemVkOworfTsKKworLyoqCisgKiBcYnJpZWYgQXJtdjgtTSBTeXN0ZW0gVGltZXIgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCB7CisgICAgY29uc3Qgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X2NmZ190KiBjb25zdCBjZmc7CisgICAgICAgIC8qITwgQXJtdjgtTSBTeXN0ZW0gVGltZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfZGF0YV90KiBjb25zdCBkYXRhOworICAgICAgICAvKiE8IEFybXY4LU0gU3lzdGVtIFRpbWVyIGRhdGEgc3RydWN0dXJlICovCit9OworCisvKioKKyAqIFxicmllZiBJbml0aWFsaXplcyB0aW1lciB0byBhIGtub3duIGRlZmF1bHQgc3RhdGUsIHdoaWNoIGlzOgorICogICAgICAgICAgLSB0aW1lciBpcyBlbmFibGVkCisgKiAgICAgICAgICAtIGludGVycnVwdCBpcyBkaXNhYmxlZAorICogICAgICAgICAgLSBhdXRvLWluY3JlbWVudCBpcyBkaXNhYmxlZAorICogICAgICAgICAgLSByZXBvcnRlZCB0aW1lciBmcmVxdWVuY3kgaXMgc2V0IHRvIGRlZmF1bHQKKyAqICAgICAgICBJbml0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gYW55IG90aGVyIHByb2Nlc3MgYW5kCisgKiAgICAgICAgaXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZm9sbG93IHByb3BlciBjYWxsIG9yZGVyLgorICogICAgICAgIE1vcmUgdGhhbiBvbmUgY2FsbCByZXN1bHRzIGZhbGwgdGhyb3VnaC4KKyAqCisgKiBccGFyYW1baW5dIGRldiBUaW1lciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzdGltZXJfYXJtdjhfbV9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2luaXQoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFVuaW5pdGlhbGl6ZXMgdGltZXIgdG8gYSBrbm93biBkZWZhdWx0IHN0YXRlLCB3aGljaCBpczoKKyAqICAgICAgICAgIC0gdGltZXIgaXMgZGlzYWJsZWQKKyAqICAgICAgICAgIC0gaW50ZXJydXB0IGlzIGRpc2FibGVkCisgKiAgICAgICAgICAtIGF1dG8taW5jcmVtZW50IGlzIGRpc2FibGVkCisgKiAgICAgICAgSW5pdCBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIGFueSBvdGhlciBwcm9jZXNzIGFuZAorICogICAgICAgIGl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZvbGxvdyBwcm9wZXIgY2FsbCBvcmRlci4KKyAqICAgICAgICBNb3JlIHRoYW4gb25lIGNhbGwgcmVzdWx0cyBmYWxsIHRocm91Z2guCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV91bmluaXQoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFJlYWRzIDY0LWJpdCBwaHlzaWNhbCBjb3VudGVyIHZhbHVlCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIDY0LWJpdCBjb3VudGVyIHZhbHVlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit1aW50NjRfdCBzeXN0aW1lcl9hcm12OF9tX2dldF9jb3VudGVyX3ZhbHVlKAorICAgICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyA2NC1iaXQgY29tcGFyZSB2YWx1ZQorICogICAgICAgIEFzIHNvb24gYXMgdGhlIHBoeXNpY2FsIHVwLWNvdW50ZXIgcmVhY2hlcyB0aGlzIHZhbHVlLCB0aGUgaW50ZXJydXB0CisgKiAgICAgICAgY29uZGl0aW9uIHdpbGwgYmUgYXNzZXJ0ZWQgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2lzX2ludGVycnVwdF9hc3NlcnRlZAorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKiBccGFyYW1baW5dIHZhbHVlIDY0LWJpdCBjb21wYXJlIHZhbHVlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c3RpbWVyX2FybXY4X21fc2V0X2NvbXBhcmVfdmFsdWUoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYsCisgICAgICAgIHVpbnQ2NF90IHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZHMgNjQtYml0IGNvbXBhcmUgdmFsdWUKKyAqCisgKiBccGFyYW1baW5dIGRldiBUaW1lciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzdGltZXJfYXJtdjhfbV9kZXZfdAorICoKKyAqIFxyZXR1cm4gNjQtYml0IGNvbXBhcmUgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQ2NF90IHN5c3RpbWVyX2FybXY4X21fZ2V0X2NvbXBhcmVfdmFsdWUoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBTZXRzIGZyZXF1ZW5jeSByZWdpc3RlciBpbiBIegorICogICAgICAgIEhhcmR3YXJlIGRvZXMgbm90IGludGVycHJldCB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyLCBzbyBpdCdzIG9ubHkKKyAqICAgICAgICBmb3Igc29mdHdhcmUgY2FuIGRpc2NvdmVyIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHN5c3RlbSBjb3VudGVyLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKiBccGFyYW1baW5dIHZhbHVlIGZyZXF1ZW5jeSBpbiBIegorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXN0aW1lcl9hcm12OF9tX3NldF9jb3VudGVyX2ZyZXEoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYsCisgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZHMgZnJlcXVlbmN5IHJlZ2lzdGVyIGluIEh6CisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIGZyZXF1ZW5jeSBpbiBIegorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordWludDMyX3Qgc3lzdGltZXJfYXJtdjhfbV9nZXRfY291bnRlcl9mcmVxKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgU2V0cyAzMi1iaXQgZG93bi1jb3VudGVyIHRpbWVyIHZhbHVlCisgKiAgICAgICAgJ0Rvd24tY291bnRlciB0aW1lciBzZXQnIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgY29tcGFyZSByZWdpc3RlciBieQorICogICAgICAgIGNvbXBhcmUgcmVnaXN0ZXIgPSBjdXJyZW50IGNvdW50ZXIgKyB0aGlzIHRpbWVyIHZhbHVlCisgKgorICogICAgICAgIEFzIHNvb24gYXMgdGhlIHRpbWVyIHZhbHVlIHJlYWNoZXMgemVybywgdGhlIGludGVycnVwdCBjb25kaXRpb24gd2lsbAorICogICAgICAgIGJlIGFzc2VydGVkIFxyZWYgc3lzdGltZXJfYXJtdjhfbV9pc19pbnRlcnJ1cHRfYXNzZXJ0ZWQuCisgKiAgICAgICAgUmVhY2hpbmcgemVybyBkb2Vzbid0IHN0b3AgdGhlIHRpbWVyLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKiBccGFyYW1baW5dIHZhbHVlIDMyLWJpdCB0aW1lciB2YWx1ZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXN0aW1lcl9hcm12OF9tX3NldF90aW1lcl92YWx1ZShzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSk7CisKKy8qKgorICogXGJyaWVmIFJlYWRzIGRvd24tY291bnRlciB0aW1lciB2YWx1ZQorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKgorICogXHJldHVybiAzMi1iaXQgdGltZXIgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IHN5c3RpbWVyX2FybXY4X21fZ2V0X3RpbWVyX3ZhbHVlKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyB0aW1lcgorICogICAgICAgIEVuYWJsZXMgdGltZXIgb3V0cHV0IHNpZ25hbCBhbmQgaW50ZXJydXB0IHN0YXR1cyBhc3NlcnRpb24KKyAqICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21faXNfaW50ZXJydXB0X2Fzc2VydGVkCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9lbmFibGVfdGltZXIoc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIERpc2FibGVzIHRpbWVyCisgKiAgICAgICAgRGlzYWJsZXMgdGltZXIgb3V0cHV0IHNpZ25hbC4gSW50ZXJydXB0IHN0YXR1cyB3aWxsIGJlIHVua25vd24KKyAqICAgICAgICBccmVmIHN5c3RpbWVyX2FybXY4X21faXNfaW50ZXJydXB0X2Fzc2VydGVkCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9kaXNhYmxlX3RpbWVyKHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyB0aW1lciBlbmFibGUgc3RhdHVzCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfdGltZXJfZW5hYmxlZCgKKyAgICAgICAgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgdGltZXIgaW50ZXJydXB0CisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9lbmFibGVfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRGlzYWJsZXMgdGltZXIgaW50ZXJydXB0CisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9kaXNhYmxlX2ludGVycnVwdCgKKyAgICAgICAgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFBvbGxzIHRpbWVyIGludGVycnVwdCBlbmFibGUgc3RhdHVzCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfaW50ZXJydXB0X2VuYWJsZWQoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyB0aW1lciBpbnRlcnJ1cHQgc3RhdHVzCisgKiAgICAgICAgSXQncyBhc3NlcnRlZCBpZgorICogICAgICAgICAgMS4gQXV0by1JbmMgaXMgZGlzYWJsZWQgYW5kIGNvdW50ZXIgcmVhY2hlcyBjb21wYXJlIHZhbHVlCisgKiAgICAgICAgICBPUgorICogICAgICAgICAgMi4gQXV0by1JbmMgaXMgZW5hYmxlZCBhbmQgY291bnRlciByZWFjaGVzIGF1dG8taW5jIHZhbHVlCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgYXNzZXJ0ZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBzeXN0aW1lcl9hcm12OF9tX2lzX2ludGVycnVwdF9hc3NlcnRlZCgKKyAgICAgICAgc3RydWN0IHN5c3RpbWVyX2FybXY4X21fZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFJlYWRzIGF1dG8taW5jcmVtZW50IHZhbHVlCisgKiAgICAgICAgVGhpcyB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYnkKKyAqICAgICAgICBhdXRvLWluYyA9IGN1cnJlbnQgY291bnRlciArIGF1dG8taW5jIHJlbG9hZAorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKgorICogXHJldHVybiA2NC1iaXQgYXV0by1pbmNyZW1lbnQgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQ2NF90IHN5c3RpbWVyX2FybXY4X21fZ2V0X2F1dG9pbmNfdmFsdWUoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBTZXRzIDMyLWJpdCBhdXRvLWluY3JlbWVudCByZWxvYWQgdmFsdWUKKyAqICAgICAgICBBdXRvLUluYyB2YWx1ZSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYnkgYWRkaW5nIHRoaXMgcmVsb2FkIHZhbHVlCisgKiAgICAgICAgdG8gdGhlIGN1cnJlbnQgY291bnRlci4KKyAqICAgICAgICBJZiB0aGUgY291bnRlciByZWFjaGVzIGF1dG8taW5jIHZhbHVlLCBpbnRlcnJ1cHQgc3RhdHVzIGlzIGFzc2VydGVkCisgKiAgICAgICAgYW5kIGF1dG8taW5jIHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IGN1cnJlbnQgcmVsb2FkLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKiBccGFyYW1baW5dIHZhbHVlIDMyLWJpdCByZWxvYWQgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9zZXRfYXV0b2luY19yZWxvYWQoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYsCisgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKKworLyoqCisgKiBcYnJpZWYgUmVhZHMgYXV0by1pbmNyZW1lbnQgcmVsb2FkIHZhbHVlCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIDMyLWJpdCBhdXRvLWluY3JlbWVudCByZWxvYWQgdmFsdWUKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IHN5c3RpbWVyX2FybXY4X21fZ2V0X2F1dG9pbmNfcmVsb2FkKAorICAgICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRW5hYmxlcyBhdXRvLWluY3JlbWVudCBtb2RlCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3ZvaWQgc3lzdGltZXJfYXJtdjhfbV9lbmFibGVfYXV0b2luYyhzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgRGlzYWJsZXMgYXV0by1pbmNyZW1lbnQgbW9kZQorICoKKyAqIFxwYXJhbVtpbl0gZGV2IFRpbWVyIGRldmljZSBzdHJ1Y3QgXHJlZiBzeXN0aW1lcl9hcm12OF9tX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHN5c3RpbWVyX2FybXY4X21fZGlzYWJsZV9hdXRvaW5jKHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBQb2xscyBhdXRvLWluY3JlbWVudCBlbmFibGUgc3RhdHVzCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitib29sIHN5c3RpbWVyX2FybXY4X21faXNfYXV0b2luY19lbmFibGVkKAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgQ2xlYXJzIGF1dG8taW5jcmVtZW50IG1vZGUgaW50ZXJydXB0IGZsYWcKKyAqCisgKiBccGFyYW1baW5dIGRldiBUaW1lciBkZXZpY2Ugc3RydWN0IFxyZWYgc3lzdGltZXJfYXJtdjhfbV9kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCBzeXN0aW1lcl9hcm12OF9tX2NsZWFyX2F1dG9pbmNfaW50ZXJydXB0KAorICAgICAgICBzdHJ1Y3Qgc3lzdGltZXJfYXJtdjhfbV9kZXZfdCogZGV2KTsKKworLyoqCisgKiBcYnJpZWYgUG9sbHMgYXV0by1pbmNyZW1lbnQgaW1wbGVtZW50YXRpb24gc3RhdHVzCisgKgorICogXHBhcmFtW2luXSBkZXYgVGltZXIgZGV2aWNlIHN0cnVjdCBccmVmIHN5c3RpbWVyX2FybXY4X21fZGV2X3QKKyAqCisgKiBccmV0dXJuIHRydWUgaWYgaW1wbGVtZW50ZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLworYm9vbCBzeXN0aW1lcl9hcm12OF9tX2lzX2F1dG9pbmNfaW1wbGVtZW50ZWQoCisgICAgICAgIHN0cnVjdCBzeXN0aW1lcl9hcm12OF9tX2Rldl90KiBkZXYpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIF9fU1lTVElNRVJfQVJNVjhfTV9EUlZfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvdWFydF9jbXNka19kcnYuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDEyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvbmF0aXZlX2RyaXZlcnMvdWFydF9jbXNka19kcnYuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNi0yMDE5IEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1YXJ0X2Ntc2RrX2Rydi5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIFVBUlQgcmVnaXN0ZXIgbWFwIHN0cnVjdHVyZSAqLworc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgZGF0YTsgICAvKiBPZmZzZXQ6IDB4MDAwIChSL1cpIGRhdGEgcmVnaXN0ZXIgICAgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBzdGF0ZTsgIC8qIE9mZnNldDogMHgwMDQgKFIvVykgc3RhdHVzIHJlZ2lzdGVyICAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IGN0cmw7ICAgLyogT2Zmc2V0OiAweDAwOCAoUi9XKSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgdW5pb24geworICAgICAgICB2b2xhdGlsZSB1aW50MzJfdCBpbnRyc3RhdHVzOyAgLyogT2Zmc2V0OiAweDAwYyAoUi8gKSBpbnRlcnJ1cHQgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgdWludDMyX3QgaW50cmNsZWFyOyAgIC8qIE9mZnNldDogMHgwMGMgKCAvVykgaW50ZXJydXB0IGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB9aW50cl9yZWc7CisgICAgdm9sYXRpbGUgdWludDMyX3QgYmF1ZGRpdjsgICAgICAgIC8qIE9mZnNldDogMHgwMTAgKFIvVykgQmF1ZHJhdGUgZGl2aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworLyogQ1RSTCBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0NNU0RLX1RYX0VOICAgICAgICgxdWwgPDwgMCkKKyNkZWZpbmUgVUFSVF9DTVNES19SWF9FTiAgICAgICAoMXVsIDw8IDEpCisjZGVmaW5lIFVBUlRfQ01TREtfVFhfSU5UUl9FTiAgKDF1bCA8PCAyKQorI2RlZmluZSBVQVJUX0NNU0RLX1JYX0lOVFJfRU4gICgxdWwgPDwgMykKKworLyogU1RBVEUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUFSVF9DTVNES19UWF9CRiAgKDF1bCA8PCAwKQorI2RlZmluZSBVQVJUX0NNU0RLX1JYX0JGICAoMXVsIDw8IDEpCisKKy8qIElOVFNUQVRVUyBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0NNU0RLX1RYX0lOVFIgICgxdWwgPDwgMCkKKyNkZWZpbmUgVUFSVF9DTVNES19SWF9JTlRSICAoMXVsIDw8IDEpCisKKy8qIFVBUlQgc3RhdGUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVUFSVF9DTVNES19JTklUSUFMSVpFRCAgKDF1bCA8PCAwKQorCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX2luaXQoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jbGspCit7CisgICAgc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCogcF91YXJ0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KilkZXYtPmNmZy0+YmFzZTsKKyAgICBpZihzeXN0ZW1fY2xrID09IDApIHsKKyAgICAgICAgcmV0dXJuIFVBUlRfQ01TREtfRVJSX0lOVkFMSURfQVJHOworICAgIH0KKworICAgIC8qIFNldHMgYmF1ZHJhdGUgYW5kIHN5c3RlbSBjbG9jayAqLworICAgIGRldi0+ZGF0YS0+c3lzdGVtX2NsayA9IHN5c3RlbV9jbGs7CisgICAgZGV2LT5kYXRhLT5iYXVkcmF0ZSA9IGRldi0+Y2ZnLT5kZWZhdWx0X2JhdWRyYXRlOworCisgICAgLyogU2V0cyBiYXVkcmF0ZSAqLworICAgIHBfdWFydC0+YmF1ZGRpdiA9IChkZXYtPmRhdGEtPnN5c3RlbV9jbGsgLyBkZXYtPmNmZy0+ZGVmYXVsdF9iYXVkcmF0ZSk7CisKKyAgICAvKiBFbmFibGVzIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLworICAgIHBfdWFydC0+Y3RybCA9IFVBUlRfQ01TREtfUlhfRU4gfCBVQVJUX0NNU0RLX1RYX0VOOworCisgICAgZGV2LT5kYXRhLT5zdGF0ZSA9IFVBUlRfQ01TREtfSU5JVElBTElaRUQ7CisKKyAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfTk9ORTsKK30KKworZW51bSB1YXJ0X2Ntc2RrX2Vycm9yX3QgdWFydF9jbXNka19zZXRfYmF1ZHJhdGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmF1ZHJhdGUpCit7CisgICAgdWludDMyX3QgYmF1ZGRpdjsKKyAgICBzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KiBwX3VhcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoYmF1ZHJhdGUgPT0gMCkgeworICAgICAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfSU5WQUxJRF9CQVVEOworICAgIH0KKworICAgIGlmKCEoZGV2LT5kYXRhLT5zdGF0ZSAmIFVBUlRfQ01TREtfSU5JVElBTElaRUQpKSB7CisgICAgICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT1RfSU5JVDsKKyAgICB9CisKKyAgICAvKiBTZXRzIGJhdWRyYXRlICovCisgICAgYmF1ZGRpdiA9IChkZXYtPmRhdGEtPnN5c3RlbV9jbGsgLyBiYXVkcmF0ZSk7CisgICAgZGV2LT5kYXRhLT5iYXVkcmF0ZSA9IGJhdWRyYXRlOworCisgICAgLyogTWluaW11bSBiYXVkZGl2IHZhbHVlICovCisgICAgaWYoYmF1ZGRpdiA8IDE2KSB7CisgICAgICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9JTlZBTElEX0JBVUQ7CisgICAgfQorCisgICAgcF91YXJ0LT5iYXVkZGl2ID0gYmF1ZGRpdjsKKworICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT05FOworfQorCit1aW50MzJfdCB1YXJ0X2Ntc2RrX2dldF9iYXVkcmF0ZShzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2KQoreworICAgIHJldHVybiBkZXYtPmRhdGEtPmJhdWRyYXRlOworfQorCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX3NldF9jbG9jayhzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeXN0ZW1fY2xrKQoreworICAgIHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqIHBfdWFydCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZihzeXN0ZW1fY2xrID09IDApIHsKKyAgICAgICAgcmV0dXJuIFVBUlRfQ01TREtfRVJSX0lOVkFMSURfQVJHOworICAgIH0KKworICAgIGlmKCEoZGV2LT5kYXRhLT5zdGF0ZSAmIFVBUlRfQ01TREtfSU5JVElBTElaRUQpKSB7CisgICAgICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT1RfSU5JVDsKKyAgICB9CisKKyAgICAvKiBTZXRzIHN5c3RlbSBjbG9jayAqLworICAgIGRldi0+ZGF0YS0+c3lzdGVtX2NsayA9IHN5c3RlbV9jbGs7CisKKyAgICAvKiBVcGRhdGVzIGJhdWRyYXRlIGRpdmlkZXIgKi8KKyAgICBwX3VhcnQtPmJhdWRkaXYgPSAoZGV2LT5kYXRhLT5zeXN0ZW1fY2xrIC8gZGV2LT5kYXRhLT5iYXVkcmF0ZSk7CisKKyAgICAvKiBFbmFibGVzIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLworICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT05FOworfQorCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX3JlYWQoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnl0ZSkKK3sKKyAgICBzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KiBwX3VhcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoIShwX3VhcnQtPnN0YXRlICYgVUFSVF9DTVNES19SWF9CRikpIHsKKyAgICAgICAgcmV0dXJuIFVBUlRfQ01TREtfRVJSX05PVF9SRUFEWTsKKyAgICB9CisKKyAgICAvKiBSZWFkcyBkYXRhICovCisgICAgKmJ5dGUgPSAodWludDhfdClwX3VhcnQtPmRhdGE7CisKKyAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfTk9ORTsKK30KKworZW51bSB1YXJ0X2Ntc2RrX2Vycm9yX3QgdWFydF9jbXNka193cml0ZShzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBieXRlKQoreworICAgIHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqIHBfdWFydCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZihwX3VhcnQtPnN0YXRlICYgVUFSVF9DTVNES19UWF9CRikgeworICAgICAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfTk9UX1JFQURZOworICAgIH0KKworICAgIC8qIFNlbmRzIGRhdGEgKi8KKyAgICBwX3VhcnQtPmRhdGEgPSBieXRlOworCisgICAgcmV0dXJuIFVBUlRfQ01TREtfRVJSX05PTkU7Cit9CisKK2VudW0gdWFydF9jbXNka19lcnJvcl90IHVhcnRfY21zZGtfaXJxX3R4X2VuYWJsZShzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqIHBfdWFydCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZighKGRldi0+ZGF0YS0+c3RhdGUgJiBVQVJUX0NNU0RLX0lOSVRJQUxJWkVEKSkgeworICAgICAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfTk9UX0lOSVQ7CisgICAgfQorCisgICAgcF91YXJ0LT5jdHJsIHw9IFVBUlRfQ01TREtfVFhfSU5UUl9FTjsKKworICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT05FOworfQorCit2b2lkIHVhcnRfY21zZGtfaXJxX3R4X2Rpc2FibGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KiBwX3VhcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoZGV2LT5kYXRhLT5zdGF0ZSAmIFVBUlRfQ01TREtfSU5JVElBTElaRUQgKSB7CisgICAgICAgIHBfdWFydC0+Y3RybCAmPSB+VUFSVF9DTVNES19UWF9JTlRSX0VOOworICAgIH0KK30KKwordWludDMyX3QgdWFydF9jbXNka190eF9yZWFkeShzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqIHBfdWFydCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZighKGRldi0+ZGF0YS0+c3RhdGUgJiBVQVJUX0NNU0RLX0lOSVRJQUxJWkVEKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gIShwX3VhcnQtPnN0YXRlICYgVUFSVF9DTVNES19UWF9CRik7Cit9CisKK2VudW0gdWFydF9jbXNka19lcnJvcl90IHVhcnRfY21zZGtfaXJxX3J4X2VuYWJsZShzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2KQoreworICAgIHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqIHBfdWFydCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZighKGRldi0+ZGF0YS0+c3RhdGUgJiBVQVJUX0NNU0RLX0lOSVRJQUxJWkVEKSkgeworICAgICAgICByZXR1cm4gVUFSVF9DTVNES19FUlJfTk9UX0lOSVQ7CisgICAgfQorCisgICAgcF91YXJ0LT5jdHJsIHw9IFVBUlRfQ01TREtfUlhfSU5UUl9FTjsKKworICAgIHJldHVybiBVQVJUX0NNU0RLX0VSUl9OT05FOworfQorCit2b2lkIHVhcnRfY21zZGtfaXJxX3J4X2Rpc2FibGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldikKK3sKKyAgICBzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KiBwX3VhcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoZGV2LT5kYXRhLT5zdGF0ZSAmIFVBUlRfQ01TREtfSU5JVElBTElaRUQpIHsKKyAgICAgICAgcF91YXJ0LT5jdHJsICY9IH5VQVJUX0NNU0RLX1JYX0lOVFJfRU47CisgICAgfQorfQorCit1aW50MzJfdCB1YXJ0X2Ntc2RrX3J4X3JlYWR5KHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYpCit7CisgICAgc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCogcF91YXJ0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IF91YXJ0X2Ntc2RrX3JlZ19tYXBfdCopZGV2LT5jZmctPmJhc2U7CisKKyAgICBpZighKGRldi0+ZGF0YS0+c3RhdGUgJiBVQVJUX0NNU0RLX0lOSVRJQUxJWkVEKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gKHBfdWFydC0+c3RhdGUgJiBVQVJUX0NNU0RLX1JYX0JGKTsKK30KKwordm9pZCB1YXJ0X2Ntc2RrX2NsZWFyX2ludGVycnVwdChzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB1YXJ0X2Ntc2RrX2lycV90IGlycSkKK3sKKyAgICBzdHJ1Y3QgX3VhcnRfY21zZGtfcmVnX21hcF90KiBwX3VhcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBfdWFydF9jbXNka19yZWdfbWFwX3QqKWRldi0+Y2ZnLT5iYXNlOworCisgICAgaWYoZGV2LT5kYXRhLT5zdGF0ZSAmIFVBUlRfQ01TREtfSU5JVElBTElaRUQpIHsKKyAgICAgICAgLyogQ2xlYXJzIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICAgICAgICBzd2l0Y2goaXJxKSB7CisgICAgICAgIGNhc2UgVUFSVF9DTVNES19JUlFfUlg6CisgICAgICAgICAgICBwX3VhcnQtPmludHJfcmVnLmludHJjbGVhciA9IFVBUlRfQ01TREtfUlhfSU5UUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVBUlRfQ01TREtfSVJRX1RYOgorICAgICAgICAgICAgcF91YXJ0LT5pbnRyX3JlZy5pbnRyY2xlYXIgPSBVQVJUX0NNU0RLX1RYX0lOVFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVQVJUX0NNU0RLX0lSUV9DT01CSU5FRDoKKyAgICAgICAgICAgIHBfdWFydC0+aW50cl9yZWcuaW50cmNsZWFyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVBUlRfQ01TREtfUlhfSU5UUiB8IFVBUlRfQ01TREtfVFhfSU5UUik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogZGVmYXVsdDogbm90IGRlZmluZWQgdG8gZm9yY2UgYWxsIGNhc2VzIHRvIGJlIGhhbmRsZWQgKi8KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL25hdGl2ZV9kcml2ZXJzL3VhcnRfY21zZGtfZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9uYXRpdmVfZHJpdmVycy91YXJ0X2Ntc2RrX2Rydi5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTkgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSB1YXJ0X2Ntc2RrX2Rydi5oCisgKiBcYnJpZWYgR2VuZXJpYyBkcml2ZXIgZm9yIEFSTSBVQVJULgorICovCisKKyNpZm5kZWYgX19VQVJUX0NNU0RLX0RSVl9IX18KKyNkZWZpbmUgX19VQVJUX0NNU0RLX0RSVl9IX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEFSTSBVQVJUIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLworc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190IHsKKyAgICBjb25zdCB1aW50MzJfdCBiYXNlOyAgICAgICAgICAgICAgLyohPCBVQVJUIGJhc2UgYWRkcmVzcyAqLworICAgIGNvbnN0IHVpbnQzMl90IGRlZmF1bHRfYmF1ZHJhdGU7ICAvKiE8IERlZmF1bHQgYmF1ZHJhdGUgKi8KK307CisKKy8qIEFSTSBVQVJUIGRldmljZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IHVhcnRfY21zZGtfZGV2X2RhdGFfdCB7CisgICAgdWludDMyX3Qgc3RhdGU7ICAgICAgIC8qITwgSW5kaWNhdGVzIGlmIHRoZSB1YXJ0IGRyaXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGlzIGluaXRpYWxpemVkIGFuZCBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVpbnQzMl90IHN5c3RlbV9jbGs7ICAvKiE8IFN5c3RlbSBjbG9jayAqLworICAgIHVpbnQzMl90IGJhdWRyYXRlOyAgICAvKiE8IEJhdWRyYXRlICovCit9OworCisvKiBBUk0gVUFSVCBkZXZpY2Ugc3RydWN0dXJlICovCitzdHJ1Y3QgdWFydF9jbXNka19kZXZfdCB7CisgICAgY29uc3Qgc3RydWN0IHVhcnRfY21zZGtfZGV2X2NmZ190KiBjb25zdCBjZmc7ICAvKiE8IFVBUlQgY29uZmlndXJhdGlvbiAqLworICAgIHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl9kYXRhX3QqIGNvbnN0IGRhdGE7ICAgICAgLyohPCBVQVJUIGRhdGEgKi8KK307CisKKy8qIEFSTSBVQVJUIGVudW1lcmF0aW9uIHR5cGVzICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB7CisgICAgVUFSVF9DTVNES19FUlJfTk9ORSA9IDAsICAgICAgLyohPCBObyBlcnJvciAqLworICAgIFVBUlRfQ01TREtfRVJSX0lOVkFMSURfQVJHLCAgIC8qITwgRXJyb3IgaW52YWxpZCBpbnB1dCBhcmd1bWVudCAqLworICAgIFVBUlRfQ01TREtfRVJSX0lOVkFMSURfQkFVRCwgIC8qITwgSW52YWxpZCBiYXVkcmF0ZSAqLworICAgIFVBUlRfQ01TREtfRVJSX05PVF9JTklULCAgICAgIC8qITwgRXJyb3IgVUFSVCBub3QgaW5pdGlhbGl6ZWQgKi8KKyAgICBVQVJUX0NNU0RLX0VSUl9OT1RfUkVBRFksICAgICAvKiE8IEVycm9yIFVBUlQgbm90IHJlYWR5ICovCit9OworCitlbnVtIHVhcnRfY21zZGtfaXJxX3QgeworICAgIFVBUlRfQ01TREtfSVJRX1JYLCAgICAgICAvKiE8IFJYIGludGVycnVwdCBzb3VyY2UgKi8KKyAgICBVQVJUX0NNU0RLX0lSUV9UWCwgICAgICAgLyohPCBUWCBpbnRlcnJ1cHQgc291cmNlICovCisgICAgVUFSVF9DTVNES19JUlFfQ09NQklORUQgIC8qITwgUlgtVFggY29tYmluZWQgaW50ZXJydXB0IHNvdXJjZSAqLworfTsKKworLyoqCisgKiBcYnJpZWYgSW5pdGlhbGl6ZXMgVUFSVC4gSXQgdXNlcyB0aGUgZGVmYXVsdCBiYXVkcmF0ZSB0byBjb25maWd1cmUKKyAqIHRoZSBwZXJpcGhlcmFsIGF0IHRoaXMgcG9pbnQuCisgKgorICogXHBhcmFtW2luXSBkZXYgICAgICAgICBVQVJUIGRldmljZSBzdHJ1Y3QgXHJlZiB1YXJ0X2Ntc2RrX2Rldl90CisgKiBccGFyYW1baW5dIHN5c3RlbV9jbGsgIFN5c3RlbSBjbG9jayB1c2VkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogXHJldHVybiBSZXR1cm5zIGVycm9yIGNvZGUgYXMgc3BlY2lmaWVkIGluIFxyZWYgdWFydF9jbXNka19lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX2luaXQoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jbGspOworCisvKioKKyAqIFxicmllZiBTZXRzIHRoZSBVQVJUIGJhdWRyYXRlLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICAgICAgIFVBUlQgZGV2aWNlIHN0cnVjdCBccmVmIHVhcnRfY21zZGtfZGV2X3QKKyAqIFxwYXJhbVtpbl0gYmF1ZHJhdGUgIE5ldyBiYXVkcmF0ZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiB1YXJ0X2Ntc2RrX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gdWFydF9jbXNka19lcnJvcl90IHVhcnRfY21zZGtfc2V0X2JhdWRyYXRlKHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhdWRyYXRlKTsKKworLyoqCisgKiBcYnJpZWYgR2V0cyB0aGUgVUFSVCBiYXVkcmF0ZS4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgVUFSVCBkZXZpY2Ugc3RydWN0IFxyZWYgdWFydF9jbXNka19kZXZfdAorICoKKyAqIFxyZXR1cm4gUmV0dXJucyB0aGUgVUFSVCBiYXVkcmF0ZS4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IHVhcnRfY21zZGtfZ2V0X2JhdWRyYXRlKHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiBTZXRzIHN5c3RlbSBjbG9jay4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgICAgICAgIFVBUlQgZGV2aWNlIHN0cnVjdCBccmVmIHVhcnRfY21zZGtfZGV2X3QKKyAqIFxwYXJhbVtpbl0gc3lzdGVtX2NsayAgU3lzdGVtIGNsb2NrIHVzZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiB1YXJ0X2Ntc2RrX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK2VudW0gdWFydF9jbXNka19lcnJvcl90IHVhcnRfY21zZGtfc2V0X2Nsb2NrKHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jbGspOworLyoqCisgKiBcYnJpZWYgUmVhZHMgb25lIGJ5dGUgZnJvbSBVQVJUIGRldi4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgIFVBUlQgZGV2aWNlIHN0cnVjdCBccmVmIHVhcnRfY21zZGtfZGV2X3QKKyAqIFxwYXJhbVtpbl0gYnl0ZSAgUG9pbnRlciB0byBieXRlLgorICoKKyAqIFxyZXR1cm4gUmV0dXJucyBlcnJvciBjb2RlIGFzIHNwZWNpZmllZCBpbiBccmVmIHVhcnRfY21zZGtfZXJyb3JfdAorICoKKyAqIFxub3RlIEZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgYW5kIGJ5dGUKKyAqIHBvaW50ZXIgYXJlIE5VTEwsIGFuZCBpZiB0aGUgZHJpdmVyIGlzIGluaXRpYWxpemVkLgorICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX3JlYWQoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBieXRlKTsKKworLyoqCisgKiBcYnJpZWYgV3JpdGVzIGEgYnl0ZSB0byBVQVJUIGRldi4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgIFVBUlQgZGV2aWNlIHN0cnVjdCBccmVmIHVhcnRfY21zZGtfZGV2X3QKKyAqIFxwYXJhbVtpbl0gYnl0ZSAgQnl0ZSB0byB3cml0ZS4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgZXJyb3IgY29kZSBhcyBzcGVjaWZpZWQgaW4gXHJlZiB1YXJ0X2Ntc2RrX2Vycm9yX3QKKyAqCisgKiBcbm90ZSBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwgYW5kCisgKiBpZiB0aGUgZHJpdmVyIGlzIGluaXRpYWxpemVkIHRvIGhhdmUgYmV0dGVyIHBlcmZvcm1hbmNlLgorICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX3dyaXRlKHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZSk7CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgVFggaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBVQVJUIGRldmljZSBzdHJ1Y3QgXHJlZiB1YXJ0X2Ntc2RrX2Rldl90CisgKgorICogXHJldHVybiBSZXR1cm5zIGVycm9yIGNvZGUgYXMgc3BlY2lmaWVkIGluIFxyZWYgdWFydF9jbXNka19lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX2lycV90eF9lbmFibGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIERpc2FibGVzIFRYIGludGVycnVwdC4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgVUFSVCBkZXZpY2Ugc3RydWN0IFxyZWYgdWFydF9jbXNka19kZXZfdAorICoKKyAqIFxub3RlIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayBpZiBkZXYgaXMgTlVMTC4KKyAqLwordm9pZCB1YXJ0X2Ntc2RrX2lycV90eF9kaXNhYmxlKHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYpOworCisvKioKKyAqIFxicmllZiAgVmVyaWZpZXMgaWYgVHggaXMgcmVhZHkgdG8gc2VuZCBtb3JlIGRhdGEuCisgKgorICogXHBhcmFtW2luXSBkZXYgIFVBUlQgZGV2aWNlIHN0cnVjdCBccmVmIHVhcnRfY21zZGtfZGV2X3QKKyAqCisgKiBccmV0dXJuICAxIGlmIFRYIGlzIHJlYWR5LCAwIG90aGVyd2lzZS4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IHVhcnRfY21zZGtfdHhfcmVhZHkoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgUlggaW50ZXJydXB0LgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBVQVJUIGRldmljZSBzdHJ1Y3QgXHJlZiB1YXJ0X2Ntc2RrX2Rldl90CisgKgorICogXHJldHVybiBSZXR1cm5zIGVycm9yIGNvZGUgYXMgc3BlY2lmaWVkIGluIFxyZWYgdWFydF9jbXNka19lcnJvcl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCitlbnVtIHVhcnRfY21zZGtfZXJyb3JfdCB1YXJ0X2Ntc2RrX2lycV9yeF9lbmFibGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIERpc2FibGVzIFJYIGludGVycnVwdAorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBVQVJUIGRldmljZSBzdHJ1Y3QgXHJlZiB1YXJ0X2Ntc2RrX2Rldl90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHVhcnRfY21zZGtfaXJxX3J4X2Rpc2FibGUoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIFZlcmlmaWVzIGlmIFJ4IGhhcyBkYXRhLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2ICBVQVJUIGRldmljZSBzdHJ1Y3QgXHJlZiB1YXJ0X2Ntc2RrX2Rldl90CisgKgorICogXHJldHVybiAxIGlmIFJYIGhhcyBkYXRhLCAwIG90aGVyd2lzZS4KKyAqCisgKiBcbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgZGV2IGlzIE5VTEwuCisgKi8KK3VpbnQzMl90IHVhcnRfY21zZGtfcnhfcmVhZHkoc3RydWN0IHVhcnRfY21zZGtfZGV2X3QqIGRldik7CisKKy8qKgorICogXGJyaWVmIENsZWFycyBVQVJUIGludGVycnVwdC4KKyAqCisgKiBccGFyYW1baW5dIGRldiAgVUFSVCBkZXZpY2Ugc3RydWN0IFxyZWYgdWFydF9jbXNka19kZXZfdAorICogXHBhcmFtW2luXSBpcnEgIElSUSBzb3VyY2UgdG8gY2xlYW4gXHJlZiB1YXJ0X2Ntc2RrX2lycV90CisgKgorICogXG5vdGUgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIGRldiBpcyBOVUxMLgorICovCit2b2lkIHVhcnRfY21zZGtfY2xlYXJfaW50ZXJydXB0KHN0cnVjdCB1YXJ0X2Ntc2RrX2Rldl90KiBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHVhcnRfY21zZGtfaXJxX3QgaXJxKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfX1VBUlRfQ01TREtfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3BhcnRpdGlvbi9mbGFzaF9sYXlvdXQuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vZmxhc2hfbGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMDQxYQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vZmxhc2hfbGF5b3V0LmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRkxBU0hfTEFZT1VUX0hfXworI2RlZmluZSBfX0ZMQVNIX0xBWU9VVF9IX18KKworI2luY2x1ZGUgInBsYXRmb3JtX2Jhc2VfYWRkcmVzcy5oIgorCisvKiBGbGFzaCBsYXlvdXQgb24gQ29yc3RvbmUtUG9sYXJpcyB3aXRoIEJMMiAobXVsdGlwbGUgaW1hZ2UgYm9vdCk6CisgKgorICogMHgwMDAwXzAwMDAgU2VjdXJlIGltYWdlICAgICBwcmltYXJ5IHNsb3QgKDM4NCBLQikKKyAqIDB4MDAwNl8wMDAwIE5vbi1zZWN1cmUgaW1hZ2UgcHJpbWFyeSBzbG90ICgzODQgS0IpCisgKiAweDAwMENfMDAwMCBTZWN1cmUgaW1hZ2UgICAgIHNlY29uZGFyeSBzbG90ICgzODQgS0IpCisgKiAweDAwMTJfMDAwMCBOb24tc2VjdXJlIGltYWdlIHNlY29uZGFyeSBzbG90ICgzODQgS0IpCisgKiAweDAwMThfMDAwMCBTY3JhdGNoIGFyZWEgKDM4NCBLQikKKyAqIDB4MDAxRV8wMDAwIFByb3RlY3RlZCBTdG9yYWdlIEFyZWEgKDIwIEtCKQorICogMHgwMDFFXzUwMDAgSW50ZXJuYWwgVHJ1c3RlZCBTdG9yYWdlIEFyZWEgKDE2IEtCKQorICogMHgwMDFFXzkwMDAgT1RQIC8gTlYgY291bnRlcnMgIGFyZWEgKDggS0IpCisgKiAweDAwMUVfQjAwMCBVbnVzZWQKKyAqCisgKiBGbGFzaCBsYXlvdXQgb24gQ29yc3RvbmUtUG9sYXJpcyB3aXRoIEJMMiAoc2luZ2xlIGltYWdlIGJvb3QpOgorICoKKyAqIDB4MDAwMF8wMDAwIFByaW1hcnkgaW1hZ2UgYXJlYSAoNzY4IEtCKToKKyAqICAgIDB4MDAwMF8wMDAwIFNlY3VyZSAgICAgaW1hZ2UgcHJpbWFyeSAoMzg0IEtCKQorICogICAgMHgwMDA2XzAwMDAgTm9uLXNlY3VyZSBpbWFnZSBwcmltYXJ5ICgzODQgS0IpCisgKiAweDAwMENfMDAwMCBTZWNvbmRhcnkgaW1hZ2UgYXJlYSAoNzY4IEtCKToKKyAqICAgIDB4MDAwQ18wMDAwIFNlY3VyZSAgICAgaW1hZ2Ugc2Vjb25kYXJ5ICgzODQgS0IpCisgKiAgICAweDAwMTJfMDAwMCBOb24tc2VjdXJlIGltYWdlIHNlY29uZGFyeSAoMzg0IEtCKQorICogMHgwMDE4XzAwMDAgU2NyYXRjaCBhcmVhICgzODQgS0IpCisgKiAweDAwMUNfMDAwMCBQcm90ZWN0ZWQgU3RvcmFnZSBBcmVhICgyMCBLQikKKyAqIDB4MDAxQ181MDAwIEludGVybmFsIFRydXN0ZWQgU3RvcmFnZSBBcmVhICgxNiBLQikKKyAqIDB4MDAxQ185MDAwIE5WIGNvdW50ZXJzIGFyZWEgKDQgS0IpCisgKiAweDAwMUVfOTAwMCBPVFAgLyBOViBjb3VudGVycyAgYXJlYSAoOCBLQikKKyAqIDB4MDAxRV9CMDAwIFVudXNlZAorICovCisKKworCisvKiBUaGlzIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkIGZyb20gbGlua2VyIHNjYXR0ZXIgZmlsZSBhcyB3ZWxsLCB3aGVyZSBvbmx5IGEKKyAqIGxpbWl0ZWQgQyBjb25zdHJ1Y3RzIGFyZSBhbGxvd2VkLiBUaGVyZWZvcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluY2x1ZGUKKyAqIGhlcmUgdGhlIHBsYXRmb3JtX3JldGFyZ2V0LmggdG8gYWNjZXNzIGZsYXNoIHJlbGF0ZWQgZGVmaW5lcy4gVG8gcmVzb2x2ZSB0aGlzCisgKiBzb21lIG9mIHRoZSB2YWx1ZXMgYXJlIHJlZGVmaW5lZCBoZXJlIHdpdGggZGlmZmVyZW50IG5hbWVzLCB0aGVzZSBhcmUgbWFya2VkCisgKiB3aXRoIGNvbW1lbnQuCisgKi8KKworLyogU2l6ZSBvZiBhIFNlY3VyZSBhbmQgb2YgYSBOb24tc2VjdXJlIGltYWdlICovCisjZGVmaW5lIEZMQVNIX1NfUEFSVElUSU9OX1NJWkUgICAgICAgICAgKDB4NjAwMDApIC8qIFMgIHBhcnRpdGlvbjogMzg0IEtCICovCisjZGVmaW5lIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFICAgICAgICAgKDB4NjAwMDApIC8qIE5TIHBhcnRpdGlvbjogMzg0IEtCICovCisjZGVmaW5lIEZMQVNIX01BWF9QQVJUSVRJT05fU0laRSAgICAgICAgKChGTEFTSF9TX1BBUlRJVElPTl9TSVpFID4gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9OU19QQVJUSVRJT05fU0laRSkgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX1NfUEFSVElUSU9OX1NJWkUgOiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKQorCisvKiBTZWN0b3Igc2l6ZSBvZiB0aGUgZmxhc2ggaGFyZHdhcmU7IHNhbWUgYXMgRkxBU0gwX1NFQ1RPUl9TSVpFICovCisjZGVmaW5lIEZMQVNIX0FSRUFfSU1BR0VfU0VDVE9SX1NJWkUgICAgKDB4MTAwMCkgICAgIC8qIDQgS0IgKi8KKy8qIFNhbWUgYXMgRkxBU0gwX1NJWkUgKi8KKyNkZWZpbmUgRkxBU0hfVE9UQUxfU0laRSAgICAgICAgICAgICAgICAoU1JBTV9TSVpFKSAgLyogMiBNQiAqLworCisvKiBGbGFzaCBsYXlvdXQgaW5mbyBmb3IgQkwyIGJvb3Rsb2FkZXIgKi8KKy8qIFNhbWUgYXMgRkxBU0gwX0JBU0VfUyAqLworI2RlZmluZSBGTEFTSF9CQVNFX0FERFJFU1MgICAgICAgICAgICAgIChTUkFNX0JBU0VfUykKKworLyogT2Zmc2V0IGFuZCBzaXplIGRlZmluaXRpb25zIG9mIHRoZSBmbGFzaCBwYXJ0aXRpb25zIHRoYXQgYXJlIGhhbmRsZWQgYnkgdGhlCisgKiBib290bG9hZGVyLiBUaGUgaW1hZ2Ugc3dhcHBpbmcgaXMgZG9uZSBiZXR3ZWVuIElNQUdFX1BSSU1BUlkgYW5kCisgKiBJTUFHRV9TRUNPTkRBUlksIFNDUkFUQ0ggaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdG9yYWdlIGR1cmluZyBpbWFnZQorICogc3dhcHBpbmcuCisgKi8KKyNkZWZpbmUgRkxBU0hfQVJFQV9CTDJfT0ZGU0VUICAgICAgKDB4MCkKKyNkZWZpbmUgRkxBU0hfQVJFQV9CTDJfU0laRSAgICAgICAgKElUQ01fU0laRSkgLyogMjU2IEtCICovCisKKyNpZiAhZGVmaW5lZChNQ1VCT09UX0lNQUdFX05VTUJFUikgfHwgKE1DVUJPT1RfSU1BR0VfTlVNQkVSID09IDEpCisvKiBTZWN1cmUgKyBOb24tc2VjdXJlIGltYWdlIHByaW1hcnkgc2xvdCAqLworI2RlZmluZSBGTEFTSF9BUkVBXzBfSUQgICAgICAgICAgICAoMSkKKyNkZWZpbmUgRkxBU0hfQVJFQV8wX09GRlNFVCAgICAgICAgKDApCisjZGVmaW5lIEZMQVNIX0FSRUFfMF9TSVpFICAgICAgICAgIChGTEFTSF9TX1BBUlRJVElPTl9TSVpFICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfTlNfUEFSVElUSU9OX1NJWkUpCisvKiBTZWN1cmUgKyBOb24tc2VjdXJlIHNlY29uZGFyeSBzbG90ICovCisjZGVmaW5lIEZMQVNIX0FSRUFfMl9JRCAgICAgICAgICAgIChGTEFTSF9BUkVBXzBfSUQgKyAxKQorI2RlZmluZSBGTEFTSF9BUkVBXzJfT0ZGU0VUICAgICAgICAoRkxBU0hfQVJFQV8wX09GRlNFVCArIEZMQVNIX0FSRUFfMF9TSVpFKQorI2RlZmluZSBGTEFTSF9BUkVBXzJfU0laRSAgICAgICAgICAoRkxBU0hfU19QQVJUSVRJT05fU0laRSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKQorLyogU2NyYXRjaCBhcmVhICovCisjZGVmaW5lIEZMQVNIX0FSRUFfU0NSQVRDSF9JRCAgICAgIChGTEFTSF9BUkVBXzJfSUQgKyAxKQorI2RlZmluZSBGTEFTSF9BUkVBX1NDUkFUQ0hfT0ZGU0VUICAoRkxBU0hfQVJFQV8yX09GRlNFVCArIEZMQVNIX0FSRUFfMl9TSVpFKQorI2RlZmluZSBGTEFTSF9BUkVBX1NDUkFUQ0hfU0laRSAgICAoRkxBU0hfTUFYX1BBUlRJVElPTl9TSVpFKQorLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YXR1cyBlbnRyaWVzIHN1cHBvcnRlZCBieSB0aGUgYm9vdGxvYWRlci4gKi8KKyNkZWZpbmUgTUNVQk9PVF9TVEFUVVNfTUFYX0VOVFJJRVMgKChGTEFTSF9TX1BBUlRJVElPTl9TSVpFICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX0FSRUFfU0NSQVRDSF9TSVpFKQorLyogTWF4aW11bSBudW1iZXIgb2YgaW1hZ2Ugc2VjdG9ycyBzdXBwb3J0ZWQgYnkgdGhlIGJvb3Rsb2FkZXIuICovCisjZGVmaW5lIE1DVUJPT1RfTUFYX0lNR19TRUNUT1JTICAgICgoRkxBU0hfU19QQVJUSVRJT05fU0laRSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9OU19QQVJUSVRJT05fU0laRSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9BUkVBX0lNQUdFX1NFQ1RPUl9TSVpFKQorI2VsaWYgKE1DVUJPT1RfSU1BR0VfTlVNQkVSID09IDIpCisvKiBTZWN1cmUgaW1hZ2UgcHJpbWFyeSBzbG90ICovCisjZGVmaW5lIEZMQVNIX0FSRUFfMF9JRCAgICAgICAgICAgICgxKQorI2RlZmluZSBGTEFTSF9BUkVBXzBfT0ZGU0VUICAgICAgICAoMCkKKyNkZWZpbmUgRkxBU0hfQVJFQV8wX1NJWkUgICAgICAgICAgKEZMQVNIX1NfUEFSVElUSU9OX1NJWkUpCisvKiBOb24tc2VjdXJlIGltYWdlIHByaW1hcnkgc2xvdCAqLworI2RlZmluZSBGTEFTSF9BUkVBXzFfSUQgICAgICAgICAgICAoRkxBU0hfQVJFQV8wX0lEICsgMSkKKyNkZWZpbmUgRkxBU0hfQVJFQV8xX09GRlNFVCAgICAgICAgKEZMQVNIX0FSRUFfMF9PRkZTRVQgKyBGTEFTSF9BUkVBXzBfU0laRSkKKyNkZWZpbmUgRkxBU0hfQVJFQV8xX1NJWkUgICAgICAgICAgKEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKQorLyogU2VjdXJlIGltYWdlIHNlY29uZGFyeSBzbG90ICovCisjZGVmaW5lIEZMQVNIX0FSRUFfMl9JRCAgICAgICAgICAgIChGTEFTSF9BUkVBXzFfSUQgKyAxKQorI2RlZmluZSBGTEFTSF9BUkVBXzJfT0ZGU0VUICAgICAgICAoRkxBU0hfQVJFQV8xX09GRlNFVCArIEZMQVNIX0FSRUFfMV9TSVpFKQorI2RlZmluZSBGTEFTSF9BUkVBXzJfU0laRSAgICAgICAgICAoRkxBU0hfU19QQVJUSVRJT05fU0laRSkKKy8qIE5vbi1zZWN1cmUgaW1hZ2Ugc2Vjb25kYXJ5IHNsb3QgKi8KKyNkZWZpbmUgRkxBU0hfQVJFQV8zX0lEICAgICAgICAgICAgKEZMQVNIX0FSRUFfMl9JRCArIDEpCisjZGVmaW5lIEZMQVNIX0FSRUFfM19PRkZTRVQgICAgICAgIChGTEFTSF9BUkVBXzJfT0ZGU0VUICsgRkxBU0hfQVJFQV8yX1NJWkUpCisjZGVmaW5lIEZMQVNIX0FSRUFfM19TSVpFICAgICAgICAgIChGTEFTSF9OU19QQVJUSVRJT05fU0laRSkKKy8qIFNjcmF0Y2ggYXJlYSAqLworI2RlZmluZSBGTEFTSF9BUkVBX1NDUkFUQ0hfSUQgICAgICAoRkxBU0hfQVJFQV8zX0lEICsgMSkKKyNkZWZpbmUgRkxBU0hfQVJFQV9TQ1JBVENIX09GRlNFVCAgKEZMQVNIX0FSRUFfM19PRkZTRVQgKyBGTEFTSF9BUkVBXzNfU0laRSkKKyNkZWZpbmUgRkxBU0hfQVJFQV9TQ1JBVENIX1NJWkUgICAgKEZMQVNIX01BWF9QQVJUSVRJT05fU0laRSkKKy8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGF0dXMgZW50cmllcyBzdXBwb3J0ZWQgYnkgdGhlIGJvb3Rsb2FkZXIuICovCisjZGVmaW5lIE1DVUJPT1RfU1RBVFVTX01BWF9FTlRSSUVTIChGTEFTSF9NQVhfUEFSVElUSU9OX1NJWkUgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9BUkVBX1NDUkFUQ0hfU0laRSkKKy8qIE1heGltdW0gbnVtYmVyIG9mIGltYWdlIHNlY3RvcnMgc3VwcG9ydGVkIGJ5IHRoZSBib290bG9hZGVyLiAqLworI2RlZmluZSBNQ1VCT09UX01BWF9JTUdfU0VDVE9SUyAgICAoRkxBU0hfTUFYX1BBUlRJVElPTl9TSVpFIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfQVJFQV9JTUFHRV9TRUNUT1JfU0laRSkKKyNlbHNlIC8qIE1DVUJPT1RfSU1BR0VfTlVNQkVSID4gMiAqLworI2Vycm9yICJPbmx5IE1DVUJPT1RfSU1BR0VfTlVNQkVSIDEgYW5kIDIgYXJlIHN1cHBvcnRlZCEiCisjZW5kaWYgLyogTUNVQk9PVF9JTUFHRV9OVU1CRVIgKi8KKworLyogbXBjX2luaXRfY2ZnIGZ1bmN0aW9uIGluIHRhcmdldF9jZmcuYyBleHBlY3RzIHRoYXQgYWxsIHRoZSBpbWFnZXMgY2FuIGZpdAorICogaW4gU1JBTSBhcmVhLiAqLworI2lmICggRkxBU0hfQVJFQV9TQ1JBVENIX09GRlNFVCArIEZMQVNIX0FSRUFfU0NSQVRDSF9TSVpFID4gU1JBTV9TSVpFKQorI2Vycm9yICJPdXQgb2YgU1JBTSBtZW1vcnkhIgorI2VuZGlmCisKKy8qIFByb3RlY3RlZCBTdG9yYWdlIChQUykgU2VydmljZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGTEFTSF9QU19BUkVBX09GRlNFVCAgICAgICAgICAgIChGTEFTSF9BUkVBX1NDUkFUQ0hfT0ZGU0VUICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9BUkVBX1NDUkFUQ0hfU0laRSkKKyNkZWZpbmUgRkxBU0hfUFNfQVJFQV9TSVpFICAgICAgICAgICAgICAoMHg1MDAwKSAgIC8qIDIwIEtCICovCisKKy8qIEludGVybmFsIFRydXN0ZWQgU3RvcmFnZSAoSVRTKSBTZXJ2aWNlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZMQVNIX0lUU19BUkVBX09GRlNFVCAgICAgICAgICAgKEZMQVNIX1BTX0FSRUFfT0ZGU0VUICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTEFTSF9QU19BUkVBX1NJWkUpCisjZGVmaW5lIEZMQVNIX0lUU19BUkVBX1NJWkUgICAgICAgICAgICAgKDB4NDAwMCkgICAvKiAxNiBLQiAqLworCisvKiBPVFBfZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRkxBU0hfT1RQX05WX0NPVU5URVJTX0FSRUFfT0ZGU0VUIChGTEFTSF9JVFNfQVJFQV9PRkZTRVQgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBU0hfSVRTX0FSRUFfU0laRSkKKyNkZWZpbmUgRkxBU0hfT1RQX05WX0NPVU5URVJTX0FSRUFfU0laRSAgIChGTEFTSF9BUkVBX0lNQUdFX1NFQ1RPUl9TSVpFICogMikKKyNkZWZpbmUgRkxBU0hfT1RQX05WX0NPVU5URVJTX1NFQ1RPUl9TSVpFIEZMQVNIX0FSRUFfSU1BR0VfU0VDVE9SX1NJWkUKKworLyogT2Zmc2V0IGFuZCBzaXplIGRlZmluaXRpb24gaW4gZmxhc2ggYXJlYSB1c2VkIGJ5IGFzc2VtYmxlLnB5ICovCisjZGVmaW5lIFNFQ1VSRV9JTUFHRV9PRkZTRVQgICAgICAgICAgICAgKDB4MCkKKyNkZWZpbmUgU0VDVVJFX0lNQUdFX01BWF9TSVpFICAgICAgICAgICBGTEFTSF9TX1BBUlRJVElPTl9TSVpFCisKKyNkZWZpbmUgTk9OX1NFQ1VSRV9JTUFHRV9PRkZTRVQgICAgICAgICAoU0VDVVJFX0lNQUdFX09GRlNFVCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVVJFX0lNQUdFX01BWF9TSVpFKQorI2RlZmluZSBOT05fU0VDVVJFX0lNQUdFX01BWF9TSVpFICAgICAgIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFCisKKy8qIEZsYXNoIGRldmljZSBuYW1lIHVzZWQgYnkgQkwyCisgKiBOYW1lIGlzIGRlZmluZWQgaW4gZmxhc2ggZHJpdmVyIGZpbGU6IERyaXZlcl9GbGFzaC5jCisgKi8KKyNkZWZpbmUgRkxBU0hfREVWX05BTUUgRHJpdmVyX0ZMQVNIMAorLyogU21hbGxlc3QgZmxhc2ggcHJvZ3JhbW1hYmxlIHVuaXQgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgVEZNX0hBTF9GTEFTSF9QUk9HUkFNX1VOSVQgICAgICAgKDB4MSkKKworLyogUHJvdGVjdGVkIFN0b3JhZ2UgKFBTKSBTZXJ2aWNlIGRlZmluaXRpb25zCisgKiBOb3RlOiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gb2YgdGhlc2UgZGVmaW5pdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZQorICogVEYtTSBQUyBJbnRlZ3JhdGlvbiBHdWlkZS4KKyAqLworI2RlZmluZSBURk1fSEFMX1BTX0ZMQVNIX0RSSVZFUiBEcml2ZXJfRkxBU0gwCisKKy8qIEluIHRoaXMgdGFyZ2V0IHRoZSBDTVNJUyBkcml2ZXIgcmVxdWlyZXMgb25seSB0aGUgb2Zmc2V0IGZyb20gdGhlIGJhc2UKKyAqIGFkZHJlc3MgaW5zdGVhZCBvZiB0aGUgZnVsbCBtZW1vcnkgYWRkcmVzcy4KKyAqLworLyogQmFzZSBhZGRyZXNzIG9mIGRlZGljYXRlZCBmbGFzaCBhcmVhIGZvciBQUyAqLworI2RlZmluZSBURk1fSEFMX1BTX0ZMQVNIX0FSRUFfQUREUiAgICBGTEFTSF9QU19BUkVBX09GRlNFVAorLyogU2l6ZSBvZiBkZWRpY2F0ZWQgZmxhc2ggYXJlYSBmb3IgUFMgKi8KKyNkZWZpbmUgVEZNX0hBTF9QU19GTEFTSF9BUkVBX1NJWkUgICAgRkxBU0hfUFNfQVJFQV9TSVpFCisjZGVmaW5lIFBTX1JBTV9GU19TSVpFICAgICAgICAgICAgICAgIFRGTV9IQUxfUFNfRkxBU0hfQVJFQV9TSVpFCisvKiBOdW1iZXIgb2YgcGh5c2ljYWwgZXJhc2Ugc2VjdG9ycyBwZXIgbG9naWNhbCBGUyBibG9jayAqLworI2RlZmluZSBURk1fSEFMX1BTX1NFQ1RPUlNfUEVSX0JMT0NLICAoMSkKKy8qIFNtYWxsZXN0IGZsYXNoIHByb2dyYW1tYWJsZSB1bml0IGluIGJ5dGVzICovCisjZGVmaW5lIFRGTV9IQUxfUFNfUFJPR1JBTV9VTklUICAgICAgICgweDEpCisKKy8qIEludGVybmFsIFRydXN0ZWQgU3RvcmFnZSAoSVRTKSBTZXJ2aWNlIGRlZmluaXRpb25zCisgKiBOb3RlOiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gb2YgdGhlc2UgZGVmaW5pdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZQorICogVEYtTSBJVFMgSW50ZWdyYXRpb24gR3VpZGUuIFRoZSBJVFMgc2hvdWxkIGJlIGluIHRoZSBpbnRlcm5hbCBmbGFzaCwgYnV0IGlzCisgKiBhbGxvY2F0ZWQgaW4gdGhlIGV4dGVybmFsIGZsYXNoIGp1c3QgZm9yIGRldmVsb3BtZW50IHBsYXRmb3JtcyB0aGF0IGRvbid0CisgKiBoYXZlIGludGVybmFsIGZsYXNoIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBURk1fSEFMX0lUU19GTEFTSF9EUklWRVIgRHJpdmVyX0ZMQVNIMAorCisvKiBJbiB0aGlzIHRhcmdldCB0aGUgQ01TSVMgZHJpdmVyIHJlcXVpcmVzIG9ubHkgdGhlIG9mZnNldCBmcm9tIHRoZSBiYXNlCisgKiBhZGRyZXNzIGluc3RlYWQgb2YgdGhlIGZ1bGwgbWVtb3J5IGFkZHJlc3MuCisgKi8KKy8qIEJhc2UgYWRkcmVzcyBvZiBkZWRpY2F0ZWQgZmxhc2ggYXJlYSBmb3IgSVRTICovCisjZGVmaW5lIFRGTV9IQUxfSVRTX0ZMQVNIX0FSRUFfQUREUiAgICBGTEFTSF9JVFNfQVJFQV9PRkZTRVQKKy8qIFNpemUgb2YgZGVkaWNhdGVkIGZsYXNoIGFyZWEgZm9yIElUUyAqLworI2RlZmluZSBURk1fSEFMX0lUU19GTEFTSF9BUkVBX1NJWkUgICAgRkxBU0hfSVRTX0FSRUFfU0laRQorI2RlZmluZSBJVFNfUkFNX0ZTX1NJWkUgICAgICAgICAgICAgICAgVEZNX0hBTF9JVFNfRkxBU0hfQVJFQV9TSVpFCisvKiBOdW1iZXIgb2YgcGh5c2ljYWwgZXJhc2Ugc2VjdG9ycyBwZXIgbG9naWNhbCBGUyBibG9jayAqLworI2RlZmluZSBURk1fSEFMX0lUU19TRUNUT1JTX1BFUl9CTE9DSyAgKDEpCisvKiBTbWFsbGVzdCBmbGFzaCBwcm9ncmFtbWFibGUgdW5pdCBpbiBieXRlcyAqLworI2RlZmluZSBURk1fSEFMX0lUU19QUk9HUkFNX1VOSVQgICAgICAgKDB4MSkKKworLyogT1RQIC8gTlYgY291bnRlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBURk1fT1RQX05WX0NPVU5URVJTX0FSRUFfU0laRSAgIChGTEFTSF9PVFBfTlZfQ09VTlRFUlNfQVJFQV9TSVpFIC8gMikKKyNkZWZpbmUgVEZNX09UUF9OVl9DT1VOVEVSU19BUkVBX0FERFIgICBGTEFTSF9PVFBfTlZfQ09VTlRFUlNfQVJFQV9PRkZTRVQKKyNkZWZpbmUgVEZNX09UUF9OVl9DT1VOVEVSU19TRUNUT1JfU0laRSBGTEFTSF9PVFBfTlZfQ09VTlRFUlNfU0VDVE9SX1NJWkUKKyNkZWZpbmUgVEZNX09UUF9OVl9DT1VOVEVSU19CQUNLVVBfQVJFQV9BRERSIChURk1fT1RQX05WX0NPVU5URVJTX0FSRUFfQUREUiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURk1fT1RQX05WX0NPVU5URVJTX0FSRUFfU0laRSkKKworI2VuZGlmIC8qIF9fRkxBU0hfTEFZT1VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3BhcnRpdGlvbi9wbGF0Zm9ybV9iYXNlX2FkZHJlc3MuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vcGxhdGZvcm1fYmFzZV9hZGRyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1YTU0MAotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vcGxhdGZvcm1fYmFzZV9hZGRyZXNzLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBcZmlsZSBwbGF0Zm9ybV9iYXNlX2FkZHJlc3MuaAorICogXGJyaWVmIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCB0aGUgcGVyaXBoZXJhbCBiYXNlIGFkZHJlc3NlcyBmb3IgQ29yc3RvbmUtUG9sYXJpcy4KKyAqLworCisjaWZuZGVmIF9fUExBVEZPUk1fQkFTRV9BRERSRVNTX0hfXworI2RlZmluZSBfX1BMQVRGT1JNX0JBU0VfQUREUkVTU19IX18KKworLyogPT09PT09PSBEZWZpbmVzIHBlcmlwaGVyYWxzIG1lbW9yeSBtYXAgYWRkcmVzc2VzID09PT09PT0gKi8KKy8qIE5vbi1zZWN1cmUgbWVtb3J5IG1hcCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSVRDTV9CQVNFX05TICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAvKiBJbnN0cnVjdGlvbiBUQ00gTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1JBTV9CQVNFX05TICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMCAvKiBDT0RFIFNSQU0gTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRFRDTTBfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMCAvKiBEYXRhIFRDTSBibG9jayAwIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIERUQ00xX0JBU0VfTlMgICAgICAgICAgICAgICAgICAgIDB4MjAwMjAwMDAgLyogRGF0YSBUQ00gYmxvY2sgMSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVENNMl9CQVNFX05TICAgICAgICAgICAgICAgICAgICAweDIwMDQwMDAwIC8qIERhdGEgVENNIGJsb2NrIDIgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRFRDTTNfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHgyMDA2MDAwMCAvKiBEYXRhIFRDTSBibG9jayAzIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElTUkFNMF9CQVNFX05TICAgICAgICAgICAgICAgICAgIDB4MjEwMDAwMDAgLyogSW50ZXJuYWwgU1JBTSBBcmVhIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElTUkFNMV9CQVNFX05TICAgICAgICAgICAgICAgICAgIDB4MjEwODAwMDAgLyogSW50ZXJuYWwgU1JBTSBBcmVhIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFFTUElfU1JBTV9CQVNFX05TICAgICAgICAgICAgICAgIDB4MjgwMDAwMDAgLyogUVNQSSBTUkFNIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisvKiBOb24tU2VjdXJlIFN1YnN5c3RlbSBwZXJpcGhlcmFsIHJlZ2lvbiAqLworI2RlZmluZSBFVEhPU19VNTVfQVBCX0JBU0VfTlMgICAgICAgICAgICAweDQwMDA0MDAwIC8qIEV0aG9zLVU1NSBBUEIgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ1BVMF9QV1JDVFJMX0JBU0VfTlMgICAgICAgICAgICAgMHg0MDAxMjAwMCAvKiBDUFUgMCBQb3dlciBDb250cm9sIEJsb2NrIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIENQVTBfSURFTlRJVFlfQkFTRV9OUyAgICAgICAgICAgIDB4NDAwMUYwMDAgLyogQ1BVIDAgSWRlbnRpdHkgQmxvY2sgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19OU0FDRkdfQkFTRV9OUyAgICAgICAgICAgMHg0MDA4MDAwMCAvKiBQb2xhcmlzIE5vbi1TZWN1cmUgQWNjZXNzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQmxvY2sgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKy8qIE5vbi1TZWN1cmUgTVNURVhQUElMTCBQZXJpcGhlcmFsIHJlZ2lvbiAqLworI2RlZmluZSBHUElPMF9DTVNES19CQVNFX05TICAgICAgICAgICAgICAweDQxMTAwMDAwIC8qIEdQSU8gMCBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBHUElPMV9DTVNES19CQVNFX05TICAgICAgICAgICAgICAweDQxMTAxMDAwIC8qIEdQSU8gMSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBHUElPMl9DTVNES19CQVNFX05TICAgICAgICAgICAgICAweDQxMTAyMDAwIC8qIEdQSU8gMiBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBHUElPM19DTVNES19CQVNFX05TICAgICAgICAgICAgICAweDQxMTAzMDAwIC8qIEdQSU8gMyBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBBSEJfVVNFUl8wX0JBU0VfTlMgICAgICAgICAgICAgICAweDQxMTA0MDAwIC8qIEFIQiBVU0VSIDAgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQUhCX1VTRVJfMV9CQVNFX05TICAgICAgICAgICAgICAgMHg0MTEwNTAwMCAvKiBBSEIgVVNFUiAxIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFIQl9VU0VSXzJfQkFTRV9OUyAgICAgICAgICAgICAgIDB4NDExMDYwMDAgLyogQUhCIFVTRVIgMiBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBBSEJfVVNFUl8zX0JBU0VfTlMgICAgICAgICAgICAgICAweDQxMTA3MDAwIC8qIEFIQiBVU0VSIDMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRE1BXzFfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0MTIwMTAwMCAvKiBETUEgMSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBETUFfMl9CQVNFX05TICAgICAgICAgICAgICAgICAgICAweDQxMjAyMDAwIC8qIERNQSAyIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIERNQV8zX0JBU0VfTlMgICAgICAgICAgICAgICAgICAgIDB4NDEyMDMwMDAgLyogRE1BIDMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRVRIRVJORVRfQkFTRV9OUyAgICAgICAgICAgICAgICAgMHg0MTQwMDAwMCAvKiBFdGhlcm5ldCBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVU0JfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgICAweDQxNTAwMDAwIC8qIFVTQiBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVU0VSX0FQQjBfQkFTRV9OUyAgICAgICAgICAgICAgICAweDQxNzAwMDAwIC8qIFVzZXIgQVBCIDAgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVVNFUl9BUEIxX0JBU0VfTlMgICAgICAgICAgICAgICAgMHg0MTcwMTAwMCAvKiBVc2VyIEFQQiAxIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVTRVJfQVBCMl9CQVNFX05TICAgICAgICAgICAgICAgIDB4NDE3MDIwMDAgLyogVXNlciBBUEIgMiBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVU0VSX0FQQjNfQkFTRV9OUyAgICAgICAgICAgICAgICAweDQxNzAzMDAwIC8qIFVzZXIgQVBCIDMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUVNQSV9DT05GSUdfQkFTRV9OUyAgICAgICAgICAgICAgMHg0MTgwMDAwMCAvKiBRU1BJIENvbmZpZyBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBRU1BJX1dSSVRFX0JBU0VfTlMgICAgICAgICAgICAgICAweDQxODAxMDAwIC8qIFFTUEkgV3JpdGUgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKy8qIE5vbi1TZWN1cmUgU3Vic3lzdGVtIHBlcmlwaGVyYWwgcmVnaW9uICovCisjZGVmaW5lIFNZU1RJTUVSMF9BUk1WOF9NX0JBU0VfTlMgICAgICAgIDB4NDgwMDAwMDAgLyogU3lzdGVtIFRpbWVyIDAgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1lTVElNRVIxX0FSTVY4X01fQkFTRV9OUyAgICAgICAgMHg0ODAwMTAwMCAvKiBTeXN0ZW0gVGltZXIgMSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNUSU1FUjJfQVJNVjhfTV9CQVNFX05TICAgICAgICAweDQ4MDAyMDAwIC8qIFN5c3RlbSBUaW1lciAyIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNZU1RJTUVSM19BUk1WOF9NX0JBU0VfTlMgICAgICAgIDB4NDgwMDMwMDAgLyogU3lzdGVtIFRpbWVyIDMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19TWVNJTkZPX0JBU0VfTlMgICAgICAgICAgMHg0ODAyMDAwMCAvKiBQb2xhcmlzIFN5c3RlbSBpbmZvIEJsb2NrIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNMT1dDTEtfVElNRVJfQ01TREtfQkFTRV9OUyAgICAgIDB4NDgwMkYwMDAgLyogQ01TREsgYmFzZWQgU0xPV0NMSyBUaW1lciBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNXRE9HX0FSTVY4X01fQ05UUkxfQkFTRV9OUyAgICAweDQ4MDQwMDAwIC8qIE5vbi1TZWN1cmUgV2F0Y2hkb2cgVGltZXIgY29udHJvbCBmcmFtZSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNXRE9HX0FSTVY4X01fUkVGUkVTSF9CQVNFX05TICAweDQ4MDQxMDAwIC8qIE5vbi1TZWN1cmUgV2F0Y2hkb2cgVGltZXIgcmVmcmVzaCBmcmFtZSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNDTlRSX1JFQURfQkFTRV9OUyAgICAgICAgICAgICAweDQ4MTAxMDAwIC8qIFN5c3RlbSBDb3VudGVyIFJlYWQgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworLyogTm9uLVNlY3VyZSBNU1RFWFBQSUhMIFBlcmlwaGVyYWwgcmVnaW9uICovCisjZGVmaW5lIFU1NV9USU1JTkdfQURBUFRFUl8wX0JBU0VfTlMgICAgIDB4NDgxMDMwMDAgLyogRXRob3MtVTU1IFRpbWluZyBBZGFwdGVyIDAgQVBCIHJlZ2lzdGVycyBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVNTVfVElNSU5HX0FEQVBURVJfMV9CQVNFX05TICAgICAweDQ4MTAzMjAwIC8qIEV0aG9zLVU1NSBUaW1pbmcgQWRhcHRlciAxIEFQQiByZWdpc3RlcnMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TQkNvbl9JMkNfVE9VQ0hfQkFTRV9OUyAgICAgMHg0OTIwMDAwMCAvKiBGUEdBIC0gU0JDb24gSTJDIChUb3VjaCkgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TQkNvbl9JMkNfQVVESU9fQkFTRV9OUyAgICAgMHg0OTIwMTAwMCAvKiBGUEdBIC0gU0JDb24gSTJDIChBdWRpbyBDb25mKSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX1NQSV9BRENfQkFTRV9OUyAgICAgICAgICAgICAweDQ5MjAyMDAwIC8qIEZQR0EgLSBQTDAyMiAoU1BJIEFEQykgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TUElfU0hJRUxEMF9CQVNFX05TICAgICAgICAgMHg0OTIwMzAwMCAvKiBGUEdBIC0gUEwwMjIgKFNQSSBTaGllbGQwKSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX1NQSV9TSElFTEQxX0JBU0VfTlMgICAgICAgICAweDQ5MjA0MDAwIC8qIEZQR0EgLSBQTDAyMiAoU1BJIFNoaWVsZDEpIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNCQ29uX0kyQ19TSElFTEQwX0JBU0VfTlMgICAgICAgIDB4NDkyMDUwMDAgLyogU0JDb24gKEkyQyAtIFNoaWVsZDApIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNCQ29uX0kyQ19TSElFTEQxX0JBU0VfTlMgICAgICAgIDB4NDkyMDYwMDAgLyogU0JDb24gKEkyQyDigJMgU2hpZWxkMSkgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVVNFUl9BUEJfQkFTRV9OUyAgICAgICAgICAgICAgICAgMHg0OTIwNzAwMCAvKiBVU0VSIEFQQiBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX0REUjRfRUVQUk9NX0JBU0VfTlMgICAgICAgICAweDQ5MjA4MDAwIC8qIEZQR0EgLSBTQkNvbiBJMkMgKEREUjQgRUVQUk9NKSBOb24tU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX1NDQ19CQVNFX05TICAgICAgICAgICAgICAgICAweDQ5MzAwMDAwIC8qIEZQR0EgLSBTQ0MgcmVnaXN0ZXJzIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEZQR0FfSTJTX0JBU0VfTlMgICAgICAgICAgICAgICAgIDB4NDkzMDEwMDAgLyogRlBHQSAtIEkyUyAoQXVkaW8pIE5vbi1TZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEZQR0FfSU9fQkFTRV9OUyAgICAgICAgICAgICAgICAgIDB4NDkzMDIwMDAgLyogRlBHQSAtIElPIChTeXN0ZW0gQ3RybCArIEkvTykgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDBfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwMzAwMCAvKiBVQVJUIDAgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDFfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwNDAwMCAvKiBVQVJUIDEgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDJfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwNTAwMCAvKiBVQVJUIDIgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDNfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwNjAwMCAvKiBVQVJUIDMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDRfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwNzAwMCAvKiBVQVJUIDQgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDVfQkFTRV9OUyAgICAgICAgICAgICAgICAgICAgMHg0OTMwODAwMCAvKiBVQVJUIDUgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0xDRF9Db25maWdfUmVnX0JBU0VfTlMgICAgICAgICAgMHg0OTMwQTAwMCAvKiBDTENEIENvbmZpZyBSZWcgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlRDX0JBU0VfTlMgICAgICAgICAgICAgICAgICAgICAgMHg0OTMwQjAwMCAvKiBSVEMgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRERSNF9CTEswX0JBU0VfTlMgICAgICAgICAgICAgICAgMHg2MDAwMDAwMCAvKiBERFI0IGJsb2NrIDAgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRERSNF9CTEsyX0JBU0VfTlMgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAvKiBERFI0IGJsb2NrIDIgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRERSNF9CTEs0X0JBU0VfTlMgICAgICAgICAgICAgICAgMHhBMDAwMDAwMCAvKiBERFI0IGJsb2NrIDQgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRERSNF9CTEs2X0JBU0VfTlMgICAgICAgICAgICAgICAgMHhDMDAwMDAwMCAvKiBERFI0IGJsb2NrIDYgTm9uLVNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKworLyogU2VjdXJlIG1lbW9yeSBtYXAgYWRkcmVzc2VzICovCisjZGVmaW5lIElUQ01fQkFTRV9TICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgLyogSW5zdHJ1Y3Rpb24gVENNIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1JBTV9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwMDAwMCAvKiBDT0RFIFNSQU0gU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVENNMF9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDMwMDAwMDAwIC8qIERhdGEgVENNIGJsb2NrIDAgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVENNMV9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDMwMDIwMDAwIC8qIERhdGEgVENNIGJsb2NrIDEgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVENNMl9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDMwMDQwMDAwIC8qIERhdGEgVENNIGJsb2NrIDIgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBEVENNM19CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDMwMDYwMDAwIC8qIERhdGEgVENNIGJsb2NrIDMgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBJU1JBTTBfQkFTRV9TICAgICAgICAgICAgICAgICAgICAweDMxMDAwMDAwIC8qIEludGVybmFsIFNSQU0gQXJlYSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIElTUkFNMV9CQVNFX1MgICAgICAgICAgICAgICAgICAgIDB4MzEwODAwMDAgLyogSW50ZXJuYWwgU1JBTSBBcmVhIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUVNQSV9TUkFNX0JBU0VfUyAgICAgICAgICAgICAgICAgMHgzODAwMDAwMCAvKiBRU1BJIFNSQU0gU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworLyogU2VjdXJlIFN1YnN5c3RlbSBwZXJpcGhlcmFsIHJlZ2lvbiAqLworI2RlZmluZSBFVEhPU19VNTVfQVBCX0JBU0VfUyAgICAgICAgICAgICAweDUwMDA0MDAwIC8qIEV0aG9zLVU1NSBBUEIgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDUFUwX1NFQ0NUUkxfQkFTRV9TICAgICAgICAgICAgICAweDUwMDExMDAwIC8qIENQVSAwIExvY2FsIFNlY3VyaXR5IENvbnRyb2wgQmxvY2sgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDUFUwX1BXUkNUUkxfQkFTRV9TICAgICAgICAgICAgICAweDUwMDEyMDAwIC8qIENQVSAwIFBvd2VyIENvbnRyb2wgQmxvY2sgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDUFUwX0lERU5USVRZX0JBU0VfUyAgICAgICAgICAgICAweDUwMDFGMDAwIC8qIENQVSAwIElkZW50aXR5IEJsb2NrIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19TQUNGR19CQVNFX1MgICAgICAgICAgICAgMHg1MDA4MDAwMCAvKiBQb2xhcmlzIFNlY3VyZSBBY2Nlc3MgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1QQ19JU1JBTTBfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTAwODMwMDAgLyogSW50ZXJuYWwgU1JBTTAgTWVtb3J5IFByb3RlY3Rpb24gQ29udHJvbGxlciBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1QQ19JU1JBTTFfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTAwODQwMDAgLyogSW50ZXJuYWwgU1JBTTEgTWVtb3J5IFByb3RlY3Rpb24gQ29udHJvbGxlciBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisvKiBTZWN1cmUgTVNURVhQUElMTCBQZXJpcGhlcmFsIHJlZ2lvbiAqLworI2RlZmluZSBHUElPMF9DTVNES19CQVNFX1MgICAgICAgICAgICAgICAweDUxMTAwMDAwIC8qIEdQSU8gMCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEdQSU8xX0NNU0RLX0JBU0VfUyAgICAgICAgICAgICAgIDB4NTExMDEwMDAgLyogR1BJTyAxIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgR1BJTzJfQ01TREtfQkFTRV9TICAgICAgICAgICAgICAgMHg1MTEwMjAwMCAvKiBHUElPIDIgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBHUElPM19DTVNES19CQVNFX1MgICAgICAgICAgICAgICAweDUxMTAzMDAwIC8qIEdQSU8gMyBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFIQl9VU0VSXzBfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTExMDQwMDAgLyogQUhCIFVTRVIgMCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFIQl9VU0VSXzFfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTExMDUwMDAgLyogQUhCIFVTRVIgMSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFIQl9VU0VSXzJfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTExMDYwMDAgLyogQUhCIFVTRVIgMiBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEFIQl9VU0VSXzNfQkFTRV9TICAgICAgICAgICAgICAgIDB4NTExMDcwMDAgLyogQUhCIFVTRVIgMyBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIERNQV8xX0JBU0VfUyAgICAgICAgICAgICAgICAgICAgIDB4NTEyMDEwMDAgLyogRE1BIDEgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBETUFfMl9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDUxMjAyMDAwIC8qIERNQSAyIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRE1BXzNfQkFTRV9TICAgICAgICAgICAgICAgICAgICAgMHg1MTIwMzAwMCAvKiBETUEgMyBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEVUSEVSTkVUX0JBU0VfUyAgICAgICAgICAgICAgICAgIDB4NTE0MDAwMDAgLyogRXRoZXJuZXQgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVU0JfQkFTRV9TICAgICAgICAgICAgICAgICAgICAgICAweDUxNTAwMDAwIC8qIFVTQiBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVTRVJfQVBCMF9CQVNFX1MgICAgICAgICAgICAgICAgIDB4NTE3MDAwMDAgLyogVXNlciBBUEIgMCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVTRVJfQVBCMV9CQVNFX1MgICAgICAgICAgICAgICAgIDB4NTE3MDEwMDAgLyogVXNlciBBUEIgMSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVTRVJfQVBCMl9CQVNFX1MgICAgICAgICAgICAgICAgIDB4NTE3MDIwMDAgLyogVXNlciBBUEIgMiBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVTRVJfQVBCM19CQVNFX1MgICAgICAgICAgICAgICAgIDB4NTE3MDMwMDAgLyogVXNlciBBUEIgMyBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFFTUElfQ09ORklHX0JBU0VfUyAgICAgICAgICAgICAgIDB4NTE4MDAwMDAgLyogUVNQSSBDb25maWcgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBRU1BJX1dSSVRFX0JBU0VfUyAgICAgICAgICAgICAgICAweDUxODAxMDAwIC8qIFFTUEkgV3JpdGUgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBNUENfU1JBTV9CQVNFX1MgICAgICAgICAgICAgICAgICAweDU3MDAwMDAwIC8qIFNSQU0gTWVtb3J5IFByb3RlY3Rpb24gQ29udHJvbGxlciBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIE1QQ19RU1BJX0JBU0VfUyAgICAgICAgICAgICAgICAgIDB4NTcwMDEwMDAgLyogUVNQSSBNZW1vcnkgUHJvdGVjdGlvbiBDb250cm9sbGVyIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTVBDX0REUjRfQkFTRV9TICAgICAgICAgICAgICAgICAgMHg1NzAwMjAwMCAvKiBERFI0IE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworLyogU2VjdXJlIFN1YnN5c3RlbSBwZXJpcGhlcmFsIHJlZ2lvbiAqLworI2RlZmluZSBTWVNUSU1FUjBfQVJNVjhfTV9CQVNFX1MgICAgICAgICAweDU4MDAwMDAwIC8qIFN5c3RlbSBUaW1lciAwIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1lTVElNRVIxX0FSTVY4X01fQkFTRV9TICAgICAgICAgMHg1ODAwMTAwMCAvKiBTeXN0ZW0gVGltZXIgMSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNZU1RJTUVSMl9BUk1WOF9NX0JBU0VfUyAgICAgICAgIDB4NTgwMDIwMDAgLyogU3lzdGVtIFRpbWVyIDAgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNUSU1FUjNfQVJNVjhfTV9CQVNFX1MgICAgICAgICAweDU4MDAzMDAwIC8qIFN5c3RlbSBUaW1lciAxIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19TWVNJTkZPX0JBU0VfUyAgICAgICAgICAgMHg1ODAyMDAwMCAvKiBQb2xhcmlzIFN5c3RlbSBpbmZvIEJsb2NrIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19TWVNDVFJMX0JBU0VfUyAgICAgICAgICAgMHg1ODAyMTAwMCAvKiBQb2xhcmlzIFN5c3RlbSBjb250cm9sIEJsb2NrIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19TWVNQUFVfQkFTRV9TICAgICAgICAgICAgMHg1ODAyMjAwMCAvKiBQb2xhcmlzIFN5c3RlbSBQb3dlciBQb2xpY3kgVW5pdCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBPTEFSSVNfQ1BVMFBQVV9CQVNFX1MgICAgICAgICAgIDB4NTgwMjMwMDAgLyogUG9sYXJpcyBDUFUgMCBQb3dlciBQb2xpY3kgVW5pdCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBPTEFSSVNfTUdNVFBQVV9CQVNFX1MgICAgICAgICAgIDB4NTgwMjgwMDAgLyogUG9sYXJpcyBNYW5hZ2VtZW50IFBvd2VyIFBvbGljeSBVbml0IFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19EQkdQUFVfQkFTRV9TICAgICAgICAgICAgMHg1ODAyOTAwMCAvKiBQb2xhcmlzIERlYnVnIFBvd2VyIFBvbGljeSBVbml0IFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9MQVJJU19OUFUwUFBVX0JBU0VfUyAgICAgICAgICAgMHg1ODAyQTAwMCAvKiBQb2xhcmlzIE5QVSAwIFBvd2VyIFBvbGljeSBVbml0IFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0xPV0NMS19XRE9HX0NNU0RLX0JBU0VfUyAgICAgICAgMHg1ODAyRTAwMCAvKiBDTVNESyBiYXNlZCBTTE9XQ0xLIFdhdGNoZG9nIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0xPV0NMS19USU1FUl9DTVNES19CQVNFX1MgICAgICAgMHg1ODAyRjAwMCAvKiBDTVNESyBiYXNlZCBTTE9XQ0xLIFRpbWVyIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU1lTV0RPR19BUk1WOF9NX0NOVFJMX0JBU0VfUyAgICAgMHg1ODA0MDAwMCAvKiBTZWN1cmUgV2F0Y2hkb2cgVGltZXIgY29udHJvbCBmcmFtZSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNZU1dET0dfQVJNVjhfTV9SRUZSRVNIX0JBU0VfUyAgIDB4NTgwNDEwMDAgLyogU2VjdXJlIFdhdGNoZG9nIFRpbWVyIHJlZnJlc2ggZnJhbWUgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNDTlRSX0NOVFJMX0JBU0VfUyAgICAgICAgICAgICAweDU4MTAwMDAwIC8qIFN5c3RlbSBDb3VudGVyIENvbnRyb2wgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTWVNDTlRSX1JFQURfQkFTRV9TICAgICAgICAgICAgICAweDU4MTAxMDAwIC8qIFN5c3RlbSBDb3VudGVyIFJlYWQgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworLyogU2VjdXJlIE1TVEVYUFBJSEwgUGVyaXBoZXJhbCByZWdpb24gKi8KKyNkZWZpbmUgVTU1X1RJTUlOR19BREFQVEVSXzBfQkFTRV9TICAgICAgMHg1ODEwMzAwMCAvKiBFdGhvcy1VNTUgVGltaW5nIEFkYXB0ZXIgMCBBUEIgcmVnaXN0ZXJzIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVTU1X1RJTUlOR19BREFQVEVSXzFfQkFTRV9TICAgICAgMHg1ODEwMzIwMCAvKiBFdGhvcy1VNTUgVGltaW5nIEFkYXB0ZXIgMSBBUEIgcmVnaXN0ZXJzIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TQkNvbl9JMkNfVE9VQ0hfQkFTRV9TICAgICAgMHg1OTIwMDAwMCAvKiBGUEdBIC0gU0JDb24gSTJDIChUb3VjaCkgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX1NCQ29uX0kyQ19BVURJT19CQVNFX1MgICAgICAweDU5MjAxMDAwIC8qIEZQR0EgLSBTQkNvbiBJMkMgKEF1ZGlvIENvbmYpIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TUElfQURDX0JBU0VfUyAgICAgICAgICAgICAgMHg1OTIwMjAwMCAvKiBGUEdBIC0gUEwwMjIgKFNQSSBBREMpIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9TUElfU0hJRUxEMF9CQVNFX1MgICAgICAgICAgMHg1OTIwMzAwMCAvKiBGUEdBIC0gUEwwMjIgKFNQSSBTaGllbGQwKSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEZQR0FfU1BJX1NISUVMRDFfQkFTRV9TICAgICAgICAgIDB4NTkyMDQwMDAgLyogRlBHQSAtIFBMMDIyIChTUEkgU2hpZWxkMSkgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTQkNvbl9JMkNfU0hJRUxEMF9CQVNFX1MgICAgICAgICAweDU5MjA1MDAwIC8qIFNCQ29uIChJMkMgLSBTaGllbGQwKSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFNCQ29uX0kyQ19TSElFTEQxX0JBU0VfUyAgICAgICAgIDB4NTkyMDYwMDAgLyogU0JDb24gKEkyQyDigJMgU2hpZWxkMSkgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVU0VSX0FQQl9CQVNFX1MgICAgICAgICAgICAgICAgICAweDU5MjA3MDAwIC8qIFVTRVIgQVBCIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9ERFI0X0VFUFJPTV9CQVNFX1MgICAgICAgICAgMHg1OTIwODAwMCAvKiBGUEdBIC0gU0JDb24gSTJDIChERFI0IEVFUFJPTSkgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX1NDQ19CQVNFX1MgICAgICAgICAgICAgICAgICAweDU5MzAwMDAwIC8qIEZQR0EgLSBTQ0MgcmVnaXN0ZXJzIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRlBHQV9JMlNfQkFTRV9TICAgICAgICAgICAgICAgICAgMHg1OTMwMTAwMCAvKiBGUEdBIC0gSTJTIChBdWRpbykgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBGUEdBX0lPX0JBU0VfUyAgICAgICAgICAgICAgICAgICAweDU5MzAyMDAwIC8qIEZQR0EgLSBJTyAoU3lzdGVtIEN0cmwgKyBJL08pIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDBfQkFTRV9TICAgICAgICAgICAgICAgICAgICAgMHg1OTMwMzAwMCAvKiBVQVJUIDAgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVQVJUMV9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDU5MzA0MDAwIC8qIFVBUlQgMSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVBUlQyX0JBU0VfUyAgICAgICAgICAgICAgICAgICAgIDB4NTkzMDUwMDAgLyogVUFSVCAyIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgVUFSVDNfQkFTRV9TICAgICAgICAgICAgICAgICAgICAgMHg1OTMwNjAwMCAvKiBVQVJUIDMgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBVQVJUNF9CQVNFX1MgICAgICAgICAgICAgICAgICAgICAweDU5MzA3MDAwIC8qIFVBUlQgNCBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFVBUlQ1X0JBU0VfUyAgICAgICAgICAgICAgICAgICAgIDB4NTkzMDgwMDAgLyogVUFSVCA1IFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0xDRF9Db25maWdfUmVnX0JBU0VfUyAgICAgICAgICAgMHg1OTMwQTAwMCAvKiBDTENEIENvbmZpZyBSZWcgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBSVENfQkFTRV9TICAgICAgICAgICAgICAgICAgICAgICAweDU5MzBCMDAwIC8qIFJUQyBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEREUjRfQkxLMV9CQVNFX1MgICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAgLyogRERSNCBibG9jayAxIFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgRERSNF9CTEszX0JBU0VfUyAgICAgICAgICAgICAgICAgMHg5MDAwMDAwMCAvKiBERFI0IGJsb2NrIDMgU2VjdXJlIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBERFI0X0JMSzVfQkFTRV9TICAgICAgICAgICAgICAgICAweEIwMDAwMDAwIC8qIEREUjQgYmxvY2sgNSBTZWN1cmUgYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIEREUjRfQkxLN19CQVNFX1MgICAgICAgICAgICAgICAgIDB4RDAwMDAwMDAgLyogRERSNCBibG9jayA3IFNlY3VyZSBiYXNlIGFkZHJlc3MgKi8KKworLyogTWVtb3J5IG1hcCBhZGRyZXNzZXMgZXhlbXB0IGZyb20gbWVtb3J5IGF0dHJpYnV0aW9uIGJ5IGJvdGggdGhlIFNBVSBhbmQgSURBVSAqLworI2RlZmluZSBQT0xBUklTX0VXSUNfQkFTRSAgICAgICAgICAgICAgICAweEUwMDQ3MDAwIC8qIEV4dGVybmFsIFdha2V1cCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFjY2VzcyBmcm9tIE5vbi1zZWN1cmUgc29mdHdhcmUgaXMgb25seSBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgQUlSQ1IuQkZIRk5NSU5TIGlzIHNldCB0byAxICovCisKKy8qIE1lbW9yeSBzaXplIGRlZmluaXRpb25zICovCisjZGVmaW5lIElUQ01fU0laRSAgICAgICAoMHgwMDA4MDAwMCkgLyogNTEyIGtCICovCisjZGVmaW5lIERUQ01fQkxLX1NJWkUgICAoMHgwMDAyMDAwMCkgLyogMTI4IGtCICovCisjZGVmaW5lIERUQ01fQkxLX05VTSAgICAoMHg0KSAgICAgICAgLyogTnVtYmVyIG9mIERUQ00gYmxvY2tzICovCisjZGVmaW5lIFNSQU1fU0laRSAgICAgICAoMHgwMDIwMDAwMCkgLyogMiBNQiAqLworI2RlZmluZSBJU1JBTTBfU0laRSAgICAgKDB4MDAwODAwMDApIC8qIDUxMiBrQiAqLworI2RlZmluZSBJU1JBTTFfU0laRSAgICAgKDB4MDAwODAwMDApIC8qIDUxMiBrQiAqLworI2RlZmluZSBRU1BJX1NSQU1fU0laRSAgKDB4MDA4MDAwMDApIC8qIDggTUIgKi8KKyNkZWZpbmUgRERSNF9CTEtfU0laRSAgICgweDEwMDAwMDAwKSAvKiAyNTYgTUIgKi8KKyNkZWZpbmUgRERSNF9CTEtfTlVNICAgICgweDgpICAgICAgICAvKiBOdW1iZXIgb2YgRERSNCBibG9ja3MgKi8KKworLyogRGVmaW5lcyBmb3IgRHJpdmVyIE1QQydzICovCisvKiBTUkFNIC0tIDIgTUIgKi8KKyNkZWZpbmUgTVBDX1NSQU1fUkFOR0VfQkFTRV9OUyAgIChTUkFNX0JBU0VfTlMpCisjZGVmaW5lIE1QQ19TUkFNX1JBTkdFX0xJTUlUX05TICAoU1JBTV9CQVNFX05TICsgU1JBTV9TSVpFLTEpCisjZGVmaW5lIE1QQ19TUkFNX1JBTkdFX09GRlNFVF9OUyAoMHgwKQorI2RlZmluZSBNUENfU1JBTV9SQU5HRV9CQVNFX1MgICAgKFNSQU1fQkFTRV9TKQorI2RlZmluZSBNUENfU1JBTV9SQU5HRV9MSU1JVF9TICAgKFNSQU1fQkFTRV9TICsgU1JBTV9TSVpFLTEpCisjZGVmaW5lIE1QQ19TUkFNX1JBTkdFX09GRlNFVF9TICAoMHgwKQorCisvKiBRU1BJIC0tIDggTUIgKi8KKyNkZWZpbmUgTVBDX1FTUElfUkFOR0VfQkFTRV9OUyAgIChRU1BJX1NSQU1fQkFTRV9OUykKKyNkZWZpbmUgTVBDX1FTUElfUkFOR0VfTElNSVRfTlMgIChRU1BJX1NSQU1fQkFTRV9OUyArIFFTUElfU1JBTV9TSVpFLTEpCisjZGVmaW5lIE1QQ19RU1BJX1JBTkdFX09GRlNFVF9OUyAoMHgwKQorI2RlZmluZSBNUENfUVNQSV9SQU5HRV9CQVNFX1MgICAgKFFTUElfU1JBTV9CQVNFX1MpCisjZGVmaW5lIE1QQ19RU1BJX1JBTkdFX0xJTUlUX1MgICAoUVNQSV9TUkFNX0JBU0VfUyArIFFTUElfU1JBTV9TSVpFLTEpCisjZGVmaW5lIE1QQ19RU1BJX1JBTkdFX09GRlNFVF9TICAoMHgwKQorCisvKiBJU1JBTTAgLS0gNTEyIGtCKi8KKyNkZWZpbmUgTVBDX0lTUkFNMF9SQU5HRV9CQVNFX05TICAgKElTUkFNMF9CQVNFX05TKQorI2RlZmluZSBNUENfSVNSQU0wX1JBTkdFX0xJTUlUX05TICAoSVNSQU0wX0JBU0VfTlMgKyBJU1JBTTBfU0laRS0xKQorI2RlZmluZSBNUENfSVNSQU0wX1JBTkdFX09GRlNFVF9OUyAoMHgwKQorI2RlZmluZSBNUENfSVNSQU0wX1JBTkdFX0JBU0VfUyAgICAoSVNSQU0wX0JBU0VfUykKKyNkZWZpbmUgTVBDX0lTUkFNMF9SQU5HRV9MSU1JVF9TICAgKElTUkFNMF9CQVNFX1MgKyBJU1JBTTBfU0laRS0xKQorI2RlZmluZSBNUENfSVNSQU0wX1JBTkdFX09GRlNFVF9TICAoMHgwKQorCisvKiBJU1JBTTEgLS0gNTEyIGtCICovCisjZGVmaW5lIE1QQ19JU1JBTTFfUkFOR0VfQkFTRV9OUyAgIChJU1JBTTFfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0lTUkFNMV9SQU5HRV9MSU1JVF9OUyAgKElTUkFNMV9CQVNFX05TICsgSVNSQU0xX1NJWkUtMSkKKyNkZWZpbmUgTVBDX0lTUkFNMV9SQU5HRV9PRkZTRVRfTlMgKDB4MCkKKyNkZWZpbmUgTVBDX0lTUkFNMV9SQU5HRV9CQVNFX1MgICAgKElTUkFNMV9CQVNFX1MpCisjZGVmaW5lIE1QQ19JU1JBTTFfUkFOR0VfTElNSVRfUyAgIChJU1JBTTFfQkFTRV9TICsgSVNSQU0xX1NJWkUtMSkKKyNkZWZpbmUgTVBDX0lTUkFNMV9SQU5HRV9PRkZTRVRfUyAgKDB4MCkKKworLyogRERSNCAtLSAyR0IgKDggKiAyNTYgTUIpICovCisjZGVmaW5lIE1QQ19ERFI0X0JMSzBfUkFOR0VfQkFTRV9OUyAgIChERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLMF9SQU5HRV9MSU1JVF9OUyAgKEREUjRfQkxLMF9CQVNFX05TICsgKChERFI0X0JMS19TSVpFKS0xKSkKKyNkZWZpbmUgTVBDX0REUjRfQkxLMF9SQU5HRV9PRkZTRVRfTlMgKDB4MCkKKyNkZWZpbmUgTVBDX0REUjRfQkxLMV9SQU5HRV9CQVNFX1MgICAgKEREUjRfQkxLMV9CQVNFX1MpCisjZGVmaW5lIE1QQ19ERFI0X0JMSzFfUkFOR0VfTElNSVRfUyAgIChERFI0X0JMSzFfQkFTRV9TICsgKChERFI0X0JMS19TSVpFKS0xKSkKKyNkZWZpbmUgTVBDX0REUjRfQkxLMV9SQU5HRV9PRkZTRVRfUyAgKEREUjRfQkxLMV9CQVNFX1MgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLMl9SQU5HRV9CQVNFX05TICAgKEREUjRfQkxLMl9CQVNFX05TKQorI2RlZmluZSBNUENfRERSNF9CTEsyX1JBTkdFX0xJTUlUX05TICAoRERSNF9CTEsyX0JBU0VfTlMgKyAoKEREUjRfQkxLX1NJWkUpLTEpKQorI2RlZmluZSBNUENfRERSNF9CTEsyX1JBTkdFX09GRlNFVF9OUyAoRERSNF9CTEsyX0JBU0VfTlMgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLM19SQU5HRV9CQVNFX1MgICAgKEREUjRfQkxLM19CQVNFX1MpCisjZGVmaW5lIE1QQ19ERFI0X0JMSzNfUkFOR0VfTElNSVRfUyAgIChERFI0X0JMSzNfQkFTRV9TICsgKChERFI0X0JMS19TSVpFKS0xKSkKKyNkZWZpbmUgTVBDX0REUjRfQkxLM19SQU5HRV9PRkZTRVRfUyAgKEREUjRfQkxLM19CQVNFX1MgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLNF9SQU5HRV9CQVNFX05TICAgKEREUjRfQkxLNF9CQVNFX05TKQorI2RlZmluZSBNUENfRERSNF9CTEs0X1JBTkdFX0xJTUlUX05TICAoRERSNF9CTEs0X0JBU0VfTlMgKyAoKEREUjRfQkxLX1NJWkUpLTEpKQorI2RlZmluZSBNUENfRERSNF9CTEs0X1JBTkdFX09GRlNFVF9OUyAoRERSNF9CTEs0X0JBU0VfTlMgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLNV9SQU5HRV9CQVNFX1MgICAgKEREUjRfQkxLNV9CQVNFX1MpCisjZGVmaW5lIE1QQ19ERFI0X0JMSzVfUkFOR0VfTElNSVRfUyAgIChERFI0X0JMSzVfQkFTRV9TICsgKChERFI0X0JMS19TSVpFKS0xKSkKKyNkZWZpbmUgTVBDX0REUjRfQkxLNV9SQU5HRV9PRkZTRVRfUyAgKEREUjRfQkxLNV9CQVNFX1MgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLNl9SQU5HRV9CQVNFX05TICAgKEREUjRfQkxLNl9CQVNFX05TKQorI2RlZmluZSBNUENfRERSNF9CTEs2X1JBTkdFX0xJTUlUX05TICAoRERSNF9CTEs2X0JBU0VfTlMgKyAoKEREUjRfQkxLX1NJWkUpLTEpKQorI2RlZmluZSBNUENfRERSNF9CTEs2X1JBTkdFX09GRlNFVF9OUyAoRERSNF9CTEs2X0JBU0VfTlMgLSBERFI0X0JMSzBfQkFTRV9OUykKKyNkZWZpbmUgTVBDX0REUjRfQkxLN19SQU5HRV9CQVNFX1MgICAgKEREUjRfQkxLN19CQVNFX1MpCisjZGVmaW5lIE1QQ19ERFI0X0JMSzdfUkFOR0VfTElNSVRfUyAgIChERFI0X0JMSzdfQkFTRV9TICsgKChERFI0X0JMS19TSVpFKS0xKSkKKyNkZWZpbmUgTVBDX0REUjRfQkxLN19SQU5HRV9PRkZTRVRfUyAgKEREUjRfQkxLN19CQVNFX1MgLSBERFI0X0JMSzBfQkFTRV9OUykKKworI2VuZGlmICAvKiBfX1BMQVRGT1JNX0JBU0VfQUREUkVTU19IX18gKi8KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vcmVnaW9uX2RlZnMuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wYXJ0aXRpb24vcmVnaW9uX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY3NTM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3BhcnRpdGlvbi9yZWdpb25fZGVmcy5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1JFR0lPTl9ERUZTX0hfXworI2RlZmluZSBfX1JFR0lPTl9ERUZTX0hfXworCisjaW5jbHVkZSAiZmxhc2hfbGF5b3V0LmgiCisjaW5jbHVkZSAicGxhdGZvcm1fYmFzZV9hZGRyZXNzLmgiCisKKyNkZWZpbmUgQkwyX0hFQVBfU0laRSAgICAgICAgICAgKDB4MDAwMTAwMCkKKyNkZWZpbmUgQkwyX01TUF9TVEFDS19TSVpFICAgICAgKDB4MDAwMTgwMCkKKworI2RlZmluZSBTX0hFQVBfU0laRSAgICAgICAgICAgICAoMHgwMDAxMDAwKQorI2RlZmluZSBTX01TUF9TVEFDS19TSVpFX0lOSVQgICAoMHgwMDAwNDAwKQorI2RlZmluZSBTX01TUF9TVEFDS19TSVpFICAgICAgICAoMHgwMDAwODAwKQorI2RlZmluZSBTX1BTUF9TVEFDS19TSVpFICAgICAgICAoMHgwMDAwODAwKQorCisjZGVmaW5lIE5TX0hFQVBfU0laRSAgICAgICAgICAgICgweDAwMDEwMDApCisjZGVmaW5lIE5TX01TUF9TVEFDS19TSVpFICAgICAgICgweDAwMDA0MDApCisjZGVmaW5lIE5TX1BTUF9TVEFDS19TSVpFICAgICAgICgweDAwMDBDMDApCisKKy8qIFRoaXMgc2l6ZSBvZiBidWZmZXIgaXMgYmlnIGVub3VnaCB0byBzdG9yZSBhbiBhdHRlc3RhdGlvbgorICogdG9rZW4gcHJvZHVjZWQgYnkgaW5pdGlhbCBhdHRlc3RhdGlvbiBzZXJ2aWNlCisgKi8KKyNkZWZpbmUgUFNBX0lOSVRJQUxfQVRURVNUX1RPS0VOX01BWF9TSVpFICAgKDB4MjUwKQorCisjaWZkZWYgQkwyCisjaWZuZGVmIExJTktfVE9fU0VDT05EQVJZX1BBUlRJVElPTgorI2RlZmluZSBTX0lNQUdFX1BSSU1BUllfUEFSVElUSU9OX09GRlNFVCAgIChGTEFTSF9BUkVBXzBfT0ZGU0VUKQorI2RlZmluZSBTX0lNQUdFX1NFQ09OREFSWV9QQVJUSVRJT05fT0ZGU0VUIChGTEFTSF9BUkVBXzJfT0ZGU0VUKQorI2Vsc2UKKyNkZWZpbmUgU19JTUFHRV9QUklNQVJZX1BBUlRJVElPTl9PRkZTRVQgICAoRkxBU0hfQVJFQV8yX09GRlNFVCkKKyNkZWZpbmUgU19JTUFHRV9TRUNPTkRBUllfUEFSVElUSU9OX09GRlNFVCAoRkxBU0hfQVJFQV8wX09GRlNFVCkKKyNlbmRpZiAvKiAhTElOS19UT19TRUNPTkRBUllfUEFSVElUSU9OICovCisjZWxzZQorI2RlZmluZSBTX0lNQUdFX1BSSU1BUllfUEFSVElUSU9OX09GRlNFVCAoMHgwKQorI2VuZGlmIC8qIEJMMiAqLworCisjaWZuZGVmIExJTktfVE9fU0VDT05EQVJZX1BBUlRJVElPTgorI2RlZmluZSBOU19JTUFHRV9QUklNQVJZX1BBUlRJVElPTl9PRkZTRVQgKEZMQVNIX0FSRUFfMF9PRkZTRVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRkxBU0hfU19QQVJUSVRJT05fU0laRSkKKyNlbHNlCisjZGVmaW5lIE5TX0lNQUdFX1BSSU1BUllfUEFSVElUSU9OX09GRlNFVCAoRkxBU0hfQVJFQV8yX09GRlNFVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGTEFTSF9TX1BBUlRJVElPTl9TSVpFKQorI2VuZGlmIC8qICFMSU5LX1RPX1NFQ09OREFSWV9QQVJUSVRJT04gKi8KKworLyogQm9vdCBwYXJ0aXRpb24gc3RydWN0dXJlIGlmIE1DVUJvb3QgaXMgdXNlZDoKKyAqIDB4MF8wMDAwIEJvb3Rsb2FkZXIgaGVhZGVyCisgKiAweDBfMDQwMCBJbWFnZSBhcmVhCisgKiAweDVfMDAwMCBUcmFpbGVyCisgKi8KKy8qIElNQUdFX0NPREVfU0laRSBpcyB0aGUgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGUgc29mdHdhcmUgYmluYXJ5IGltYWdlLgorICogSXQgaXMgbGVzcyB0aGFuIHRoZSBGTEFTSF9TX1BBUlRJVElPTl9TSVpFICsgRkxBU0hfTlNfUEFSVElUSU9OX1NJWkUKKyAqIGJlY2F1c2Ugd2UgcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGltYWdlIGhlYWRlciBhbmQgdHJhaWxlciBpbnRyb2R1Y2VkCisgKiBieSB0aGUgYm9vdGxvYWRlci4KKyAqLworI2lmZGVmIEJMMgorI2RlZmluZSBCTDJfSEVBREVSX1NJWkUgICAgICAoMHg0MDApICAgICAgIC8qIDEgS0IgKi8KKyNkZWZpbmUgQkwyX1RSQUlMRVJfU0laRSAgICAgKDB4ODAwKSAgICAgICAvKiAyIEtCICovCisjZWxzZQorLyogTm8gaGVhZGVyIGlmIG5vIGJvb3Rsb2FkZXIsIGJ1dCBrZWVwIElNQUdFX0NPREVfU0laRSB0aGUgc2FtZSAqLworI2RlZmluZSBCTDJfSEVBREVSX1NJWkUgICAgICAoMHgwKQorI2RlZmluZSBCTDJfVFJBSUxFUl9TSVpFICAgICAoMHhDMDApCisjZW5kaWYgLyogQkwyICovCisKKyNpZiAoIWRlZmluZWQoTUNVQk9PVF9JTUFHRV9OVU1CRVIpIHx8IChNQ1VCT09UX0lNQUdFX05VTUJFUiA9PSAxKSkgJiYgXAorICAgIChOU19JTUFHRV9QUklNQVJZX1BBUlRJVElPTl9PRkZTRVQgPiBTX0lNQUdFX1BSSU1BUllfUEFSVElUSU9OX09GRlNFVCkKKy8qIElmIHNlY3VyZSBpbWFnZSBhbmQgbm9uc2VjdXJlIGltYWdlIGFyZSBjb25jYXRlbmF0ZWQsIGFuZCBub25zZWN1cmUgaW1hZ2UKKyAqIGxvY2F0ZXMgYXQgdGhlIGhpZ2hlciBtZW1vcnkgcmFuZ2UsIHRoZW4gdGhlIHNlY3VyZSBpbWFnZSBkb2VzIG5vdCBuZWVkCisgKiB0aGUgdHJhaWxlciBhcmVhLgorICovCisjZGVmaW5lIElNQUdFX1NfQ09ERV9TSVpFIFwKKyAgICAgICAgICAgIChGTEFTSF9TX1BBUlRJVElPTl9TSVpFIC0gQkwyX0hFQURFUl9TSVpFKQorI2Vsc2UKKyNkZWZpbmUgSU1BR0VfU19DT0RFX1NJWkUgXAorICAgICAgICAgICAgKEZMQVNIX1NfUEFSVElUSU9OX1NJWkUgLSBCTDJfSEVBREVSX1NJWkUgLSBCTDJfVFJBSUxFUl9TSVpFKQorI2VuZGlmCisKKyNkZWZpbmUgSU1BR0VfTlNfQ09ERV9TSVpFIFwKKyAgICAgICAgICAgIChGTEFTSF9OU19QQVJUSVRJT05fU0laRSAtIEJMMl9IRUFERVJfU0laRSAtIEJMMl9UUkFJTEVSX1NJWkUpCisKKyNkZWZpbmUgQ01TRV9WRU5FRVJfUkVHSU9OX1NJWkUgICAgICgweDM0MCkKKworLyogU2VjdXJlIHJlZ2lvbnMgKi8KKyNkZWZpbmUgU19JTUFHRV9QUklNQVJZX0FSRUFfT0ZGU0VUIFwKKyAgICAgICAgICAgICAoU19JTUFHRV9QUklNQVJZX1BBUlRJVElPTl9PRkZTRVQgKyBCTDJfSEVBREVSX1NJWkUpCisvKiBTZWN1cmUgQ29kZSBzdG9yZWQgaW4gQ29kZSBTUkFNICovCisjZGVmaW5lIFNfQ09ERV9TVEFSVCAgICAoKFNSQU1fQkFTRV9TKSArICAoU19JTUFHRV9QUklNQVJZX0FSRUFfT0ZGU0VUKSkKKyNkZWZpbmUgU19DT0RFX1NJWkUgICAgIChJTUFHRV9TX0NPREVfU0laRSAtIENNU0VfVkVORUVSX1JFR0lPTl9TSVpFKQorI2RlZmluZSBTX0NPREVfTElNSVQgICAgKFNfQ09ERV9TVEFSVCArIFNfQ09ERV9TSVpFIC0gMSkKKworLyogU2VjdXJlIERhdGEgc3RvcmVkIGluIERUQ00gKi8KKyNkZWZpbmUgU19EQVRBX1NUQVJUICAgIChEVENNMF9CQVNFX1MpCisjZGVmaW5lIFNfREFUQV9TSVpFICAgICAoRFRDTV9CTEtfU0laRSAqIERUQ01fQkxLX05VTSkKKyNkZWZpbmUgU19EQVRBX0xJTUlUICAgIChTX0RBVEFfU1RBUlQgKyBTX0RBVEFfU0laRSAtIDEpCisKKy8qIENNU0UgVmVuZWVycyByZWdpb24gKi8KKyNkZWZpbmUgQ01TRV9WRU5FRVJfUkVHSU9OX1NUQVJUICAoU19DT0RFX0xJTUlUICsgMSkKKworLyogTm9uLXNlY3VyZSByZWdpb25zICovCisjZGVmaW5lIE5TX0lNQUdFX1BSSU1BUllfQVJFQV9PRkZTRVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgKE5TX0lNQUdFX1BSSU1BUllfUEFSVElUSU9OX09GRlNFVCArIEJMMl9IRUFERVJfU0laRSkKKy8qIE5vbi1TZWN1cmUgQ29kZSBzdG9yZWQgaW4gQ29kZSBTUkFNIG1lbW9yeSAqLworI2RlZmluZSBOU19DT0RFX1NUQVJUICAgKFNSQU1fQkFTRV9OUyArIChOU19JTUFHRV9QUklNQVJZX0FSRUFfT0ZGU0VUKSkKKyNkZWZpbmUgTlNfQ09ERV9TSVpFICAgIChJTUFHRV9OU19DT0RFX1NJWkUpCisjZGVmaW5lIE5TX0NPREVfTElNSVQgICAoTlNfQ09ERV9TVEFSVCArIE5TX0NPREVfU0laRSAtIDEpCisKKy8qIE5vbi1TZWN1cmUgRGF0YSBzdG9yZWQgaW4gSVNSQU0wICovCisjZGVmaW5lIE5TX0RBVEFfU1RBUlQgICAoSVNSQU0wX0JBU0VfTlMpCisjZGVmaW5lIE5TX0RBVEFfU0laRSAgICAoSVNSQU0wX1NJWkUpCisjZGVmaW5lIE5TX0RBVEFfTElNSVQgICAoTlNfREFUQV9TVEFSVCArIE5TX0RBVEFfU0laRSAtIDEpCisKKy8qIE5TIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBNUEMgYW5kIFNBVSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE5TX1BBUlRJVElPTl9TVEFSVCBcCisgICAgICAgICAgICAoKFNSQU1fQkFTRV9OUykgKyAoTlNfSU1BR0VfUFJJTUFSWV9QQVJUSVRJT05fT0ZGU0VUKSkKKyNkZWZpbmUgTlNfUEFSVElUSU9OX1NJWkUgKEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKQorCisvKiBTZWNvbmRhcnkgcGFydGl0aW9uIGZvciBuZXcgaW1hZ2VzIGluIGNhc2Ugb2YgZmlybXdhcmUgdXBncmFkZSAqLworI2RlZmluZSBTRUNPTkRBUllfUEFSVElUSU9OX1NUQVJUIFwKKyAgICAgICAgICAgICgoU1JBTV9CQVNFX05TKSArIChTX0lNQUdFX1NFQ09OREFSWV9QQVJUSVRJT05fT0ZGU0VUKSkKKyNkZWZpbmUgU0VDT05EQVJZX1BBUlRJVElPTl9TSVpFIChGTEFTSF9TX1BBUlRJVElPTl9TSVpFICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQVNIX05TX1BBUlRJVElPTl9TSVpFKQorCisjaWZkZWYgQkwyCisvKiBCb290bG9hZGVyIHJlZ2lvbnMgKi8KKy8qIFVzZSBJVENNIHRvIHN0b3JlIEJvb3Rsb2FkZXIgKi8KKyNkZWZpbmUgQkwyX0NPREVfU1RBUlQgICAgKElUQ01fQkFTRV9TKQorI2RlZmluZSBCTDJfQ09ERV9TSVpFICAgICAoSVRDTV9TSVpFKQorI2RlZmluZSBCTDJfQ09ERV9MSU1JVCAgICAoQkwyX0NPREVfU1RBUlQgKyBCTDJfQ09ERV9TSVpFIC0gMSkKKworLyogQm9vdGxvYWRlciB1c2VzIHNhbWUgbWVtb3J5IGFzIGZvciBzZWN1cmUgaW1hZ2UgKi8KKyNkZWZpbmUgQkwyX0RBVEFfU1RBUlQgICAgKFNfREFUQV9TVEFSVCkKKyNkZWZpbmUgQkwyX0RBVEFfU0laRSAgICAgKFNfREFUQV9TSVpFKQorI2RlZmluZSBCTDJfREFUQV9MSU1JVCAgICAoQkwyX0RBVEFfU1RBUlQgKyBCTDJfREFUQV9TSVpFIC0gMSkKKyNlbmRpZiAvKiBCTDIgKi8KKworLyogU2hhcmVkIGRhdGEgYXJlYSBiZXR3ZWVuIGJvb3Rsb2FkZXIgYW5kIHJ1bnRpbWUgZmlybXdhcmUuCisgKiBTaGFyZWQgZGF0YSBhcmVhIGlzIGFsbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBSQU0sIGl0IGlzIG92ZXJsYXBwaW5nCisgKiB3aXRoIFRGLU0gU2VjdXJlIGNvZGUncyBNU1Agc3RhY2sKKyAqLworI2RlZmluZSBCT09UX1RGTV9TSEFSRURfREFUQV9CQVNFIFNfREFUQV9TVEFSVAorI2RlZmluZSBCT09UX1RGTV9TSEFSRURfREFUQV9TSVpFICgweDQwMCkKKyNkZWZpbmUgQk9PVF9URk1fU0hBUkVEX0RBVEFfTElNSVQgKEJPT1RfVEZNX1NIQVJFRF9EQVRBX0JBU0UgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09UX1RGTV9TSEFSRURfREFUQV9TSVpFIC0gMSkKKworI2VuZGlmIC8qIF9fUkVHSU9OX0RFRlNfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvcGxhdF90ZXN0LmMgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvcGxhdF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlMjFjMgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wbGF0X3Rlc3QuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEsIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqCisgKi8KKworI2luY2x1ZGUgInBsYXRmb3JtX2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAic3lzdGltZXJfYXJtdjgtbV9kcnYuaCIKKyNpbmNsdWRlICJ0Zm1fcGxhdF90ZXN0LmgiCisjaW5jbHVkZSAiZGV2aWNlX2RlZmluaXRpb24uaCIKKworLyogSW50ZXJydXB0IGludGVydmFsIGlzIHNldCB0byAxIG1zICovCisjZGVmaW5lIFRJTUVSX1JFTE9BRF9WQUxVRSAgICAgICAgICAoU1lTVElNRVIwX0FSTVY4TV9ERUZBVUxUX0ZSRVFfSFogLyAxMDAwKQorCit2b2lkIHRmbV9wbGF0X3Rlc3Rfc2VjdXJlX3RpbWVyX3N0YXJ0KHZvaWQpCit7CisgICAgc3lzdGltZXJfYXJtdjhfbV9pbml0KCZTWVNUSU1FUjBfQVJNVjhfTV9ERVZfUyk7CisgICAgc3lzdGltZXJfYXJtdjhfbV9zZXRfYXV0b2luY19yZWxvYWQoJlNZU1RJTUVSMF9BUk1WOF9NX0RFVl9TLCBUSU1FUl9SRUxPQURfVkFMVUUpOworICAgIHN5c3RpbWVyX2FybXY4X21fZW5hYmxlX2F1dG9pbmMoJlNZU1RJTUVSMF9BUk1WOF9NX0RFVl9TKTsKKyAgICBzeXN0aW1lcl9hcm12OF9tX2VuYWJsZV9pbnRlcnJ1cHQoJlNZU1RJTUVSMF9BUk1WOF9NX0RFVl9TKTsKK30KKwordm9pZCB0Zm1fcGxhdF90ZXN0X3NlY3VyZV90aW1lcl9jbGVhcl9pbnRyKHZvaWQpCit7CisgICAgc3lzdGltZXJfYXJtdjhfbV9jbGVhcl9hdXRvaW5jX2ludGVycnVwdCgmU1lTVElNRVIwX0FSTVY4X01fREVWX1MpOworfQorCit2b2lkIHRmbV9wbGF0X3Rlc3Rfc2VjdXJlX3RpbWVyX3N0b3Aodm9pZCkKK3sKKyAgICBzeXN0aW1lcl9hcm12OF9tX3VuaW5pdCgmU1lTVElNRVIwX0FSTVY4X01fREVWX1MpOworICAgIHN5c3RpbWVyX2FybXY4X21fY2xlYXJfYXV0b2luY19pbnRlcnJ1cHQoJlNZU1RJTUVSMF9BUk1WOF9NX0RFVl9TKTsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wcmVsb2FkLmNtYWtlIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3ByZWxvYWQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZTNkYgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9wcmVsb2FkLmNtYWtlCkBAIC0wLDAgKzEsMTUgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvcHlyaWdodCAoYykgMjAyMSwgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgcHJlbG9hZC5jbWFrZSBpcyB1c2VkIHRvIHNldCB0aGluZ3MgdGhhdCByZWxhdGVkIHRvIHRoZSBwbGF0Zm9ybSB0aGF0IGFyZSBib3RoCisjIGltbXV0YWJsZSBhbmQgZ2xvYmFsLCB3aGljaCBpcyB0byBzYXkgdGhleSBzaG91bGQgYXBwbHkgdG8gYW55IGtpbmQgb2YgcHJvamVjdAorIyB0aGF0IHVzZXMgdGhpcyBwbGF0Zm9ybS4gSW4gcHJhY3Rpc2UgdGhpcyBpcyBub3JtYWxseSBjb21waWxlciBkZWZpbml0aW9ucyBhbmQKKyMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gaGFyZHdhcmUuCisKKyMgU2V0IGFyY2hpdGVjdHVyZQorc2V0KFRGTV9TWVNURU1fQVJDSElURUNUVVJFIGFybXY4LjEtbS5tYWluKQorc2V0KFRGTV9TWVNURU1fTVZFIE9GRikKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9zZXJ2aWNlcy9zcmMvdGZtX3BsYXRmb3JtX3N5c3RlbS5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3NlcnZpY2VzL3NyYy90Zm1fcGxhdGZvcm1fc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4MTM0MwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy9zZXJ2aWNlcy9zcmMvdGZtX3BsYXRmb3JtX3N5c3RlbS5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMSwgQXJtIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICoKKyAqLworCisjaW5jbHVkZSAidGZtX3BsYXRmb3JtX3N5c3RlbS5oIgorI2luY2x1ZGUgInRhcmdldF9jZmcuaCIKKyNpbmNsdWRlICJjbXNpcy5oIgorCit2b2lkIHRmbV9wbGF0Zm9ybV9oYWxfc3lzdGVtX3Jlc2V0KHZvaWQpCit7CisgICAgX19kaXNhYmxlX2lycSgpOworICAgIG1wY19yZXZlcnRfbm9uX3NlY3VyZV90b19zZWN1cmVfY2ZnKCk7CisKKyAgICAvKiBSZXNldCB0aGUgc3lzdGVtICovCisgICAgTlZJQ19TeXN0ZW1SZXNldCgpOworfQorCitlbnVtIHRmbV9wbGF0Zm9ybV9lcnJfdCB0Zm1fcGxhdGZvcm1faGFsX2lvY3RsKHRmbV9wbGF0Zm9ybV9pb2N0bF9yZXFfdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2FfaW52ZWMgICppbl92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzYV9vdXR2ZWMgKm91dF92ZWMpCit7CisgICAgKHZvaWQpcmVxdWVzdDsKKyAgICAodm9pZClpbl92ZWM7CisgICAgKHZvaWQpb3V0X3ZlYzsKKworICAgIC8qIE5vdCBuZWVkZWQgZm9yIHRoaXMgcGxhdGZvcm0gKi8KKyAgICByZXR1cm4gVEZNX1BMQVRGT1JNX0VSUl9OT1RfU1VQUE9SVEVEOworfQorCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvc3BtX2hhbC5jIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3NwbV9oYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA4ZDIwCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3NwbV9oYWwuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIxLCBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKgorICovCisKKyNpbmNsdWRlICJjbXNpcy5oIgorI2luY2x1ZGUgInRmbV9zcG1faGFsLmgiCisjaW5jbHVkZSAidGZtX3BsYXRmb3JtX2NvcmVfYXBpLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NmZy5oIgorI2luY2x1ZGUgIkRyaXZlcl9NUEMuaCIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKworLyogR2V0IGFkZHJlc3Mgb2YgbWVtb3J5IHJlZ2lvbnMgdG8gY29uZmlndXJlIE1QVSAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtZW1vcnlfcmVnaW9uX2xpbWl0cyBtZW1vcnlfcmVnaW9uczsKKwordm9pZCBNUENfSGFuZGxlcih2b2lkKQoreworICAgIC8qIENsZWFyIE1QQyBpbnRlcnJ1cHQgZmxhZyBhbmQgcGVuZGluZyBNUEMgSVJRICovCisgICAgbXBjX2NsZWFyX2lycSgpOworICAgIE5WSUNfQ2xlYXJQZW5kaW5nSVJRKE1QQ19JUlFuKTsKKworICAgIC8qIFByaW50IGZhdWx0IG1lc3NhZ2UgYW5kIGJsb2NrIGV4ZWN1dGlvbiAqLworICAgIEVSUk9SX01TRygiT29wcy4uLiBNUEMgZmF1bHQhISEiKTsKKworICAgIC8qIEluZm9ybSBURi1NIGNvcmUgdGhhdCBpc29sYXRpb24gYm91bmRhcnkgaGFzIGJlZW4gdmlvbGF0ZWQgKi8KKyAgICB0Zm1fYWNjZXNzX3Zpb2xhdGlvbl9oYW5kbGVyKCk7Cit9CisKK3ZvaWQgUFBDX0hhbmRsZXIodm9pZCkKK3sKKyAgICAvKiBDbGVhciBQUEMgaW50ZXJydXB0IGZsYWcgYW5kIHBlbmRpbmcgUFBDIElSUSAqLworICAgIHBwY19jbGVhcl9pcnEoKTsKKyAgICBOVklDX0NsZWFyUGVuZGluZ0lSUShQUENfSVJRbik7CisKKyAgICAvKiBQcmludCBmYXVsdCBtZXNzYWdlKi8KKyAgICBFUlJPUl9NU0coIk9vcHMuLi4gUFBDIGZhdWx0ISEhIik7CisKKyAgICAvKiBJbmZvcm0gVEYtTSBjb3JlIHRoYXQgaXNvbGF0aW9uIGJvdW5kYXJ5IGhhcyBiZWVuIHZpb2xhdGVkICovCisgICAgdGZtX2FjY2Vzc192aW9sYXRpb25faGFuZGxlcigpOworfQorCit1aW50MzJfdCB0Zm1fc3BtX2hhbF9nZXRfbnNfVlRPUih2b2lkKQoreworICAgIHJldHVybiBtZW1vcnlfcmVnaW9ucy5ub25fc2VjdXJlX2NvZGVfc3RhcnQ7Cit9CisKK3VpbnQzMl90IHRmbV9zcG1faGFsX2dldF9uc19NU1Aodm9pZCkKK3sKKyAgICByZXR1cm4gKigodWludDMyX3QgKiltZW1vcnlfcmVnaW9ucy5ub25fc2VjdXJlX2NvZGVfc3RhcnQpOworfQorCit1aW50MzJfdCB0Zm1fc3BtX2hhbF9nZXRfbnNfZW50cnlfcG9pbnQodm9pZCkKK3sKKyAgICByZXR1cm4gKigodWludDMyX3QgKikobWVtb3J5X3JlZ2lvbnMubm9uX3NlY3VyZV9jb2RlX3N0YXJ0KyA0KSk7Cit9CisKK2VudW0gdGZtX3BsYXRfZXJyX3QgdGZtX3NwbV9oYWxfc2V0X3NlY3VyZV9pcnFfcHJpb3JpdHkoSVJRbl9UeXBlIGlycV9saW5lKQoreworICAgIE5WSUNfU2V0UHJpb3JpdHkoaXJxX2xpbmUsIERFRkFVTFRfSVJRX1BSSU9SSVRZKTsKKyAgICByZXR1cm4gVEZNX1BMQVRfRVJSX1NVQ0NFU1M7Cit9CisKK3ZvaWQgdGZtX3NwbV9oYWxfY2xlYXJfcGVuZGluZ19pcnEoSVJRbl9UeXBlIGlycV9saW5lKQoreworICAgIE5WSUNfQ2xlYXJQZW5kaW5nSVJRKGlycV9saW5lKTsKK30KKwordm9pZCB0Zm1fc3BtX2hhbF9lbmFibGVfaXJxKElSUW5fVHlwZSBpcnFfbGluZSkKK3sKKyAgICBOVklDX0VuYWJsZUlSUShpcnFfbGluZSk7Cit9CisKK3ZvaWQgdGZtX3NwbV9oYWxfZGlzYWJsZV9pcnEoSVJRbl9UeXBlIGlycV9saW5lKQoreworICAgIE5WSUNfRGlzYWJsZUlSUShpcnFfbGluZSk7Cit9CisKK2VudW0gaXJxX3RhcmdldF9zdGF0ZV90IHRmbV9zcG1faGFsX3NldF9pcnFfdGFyZ2V0X3N0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSUW5fVHlwZSBpcnFfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlycV90YXJnZXRfc3RhdGVfdCB0YXJnZXRfc3RhdGUpCit7CisgICAgdWludDMyX3QgcmVzdWx0OworCisgICAgaWYgKHRhcmdldF9zdGF0ZSA9PSBURk1fSVJRX1RBUkdFVF9TVEFURV9TRUNVUkUpIHsKKyAgICAgICAgcmVzdWx0ID0gTlZJQ19DbGVhclRhcmdldFN0YXRlKGlycV9saW5lKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBOVklDX1NldFRhcmdldFN0YXRlKGlycV9saW5lKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIHJldHVybiBURk1fSVJRX1RBUkdFVF9TVEFURV9OT05fU0VDVVJFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBURk1fSVJRX1RBUkdFVF9TVEFURV9TRUNVUkU7CisgICAgfQorfQorCisjaWZuZGVmIFRGTV9QU0FfQVBJCisKK2VudW0gdGZtX3BsYXRfZXJyX3QgdGZtX3NwbV9oYWxfY29uZmlndXJlX2RlZmF1bHRfaXNvbGF0aW9uKAorICAgICAgICAgICAgICAgICAgYm9vbCBwcml2aWxlZ2VkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RhdGFfdCAqcGxhdGZvcm1fZGF0YSkKK3sKKyAgICBpZiAoIXBsYXRmb3JtX2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9JTlZBTElEX0lOUFVUOworICAgIH0KKworICAgIGlmIChwbGF0Zm9ybV9kYXRhLT5wZXJpcGhfcHBjX2JhbmsgIT0gUFBDX1NQX0RPX05PVF9DT05GSUdVUkUpIHsKKyAgICAgICAgcHBjX2NvbmZpZ3VyZV90b19zZWN1cmUocGxhdGZvcm1fZGF0YS0+cGVyaXBoX3BwY19iYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9kYXRhLT5wZXJpcGhfcHBjX21hc2spOworICAgICAgICBpZiAocHJpdmlsZWdlZCkgeworICAgICAgICAgICAgcHBjX2Nscl9zZWN1cmVfdW5wcml2KHBsYXRmb3JtX2RhdGEtPnBlcmlwaF9wcGNfYmFuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9kYXRhLT5wZXJpcGhfcHBjX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHBjX2VuX3NlY3VyZV91bnByaXYocGxhdGZvcm1fZGF0YS0+cGVyaXBoX3BwY19iYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fZGF0YS0+cGVyaXBoX3BwY19tYXNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVEZNX1BMQVRfRVJSX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiBURk1fUFNBX0FQSSAqLwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3RhcmdldF9jZmcuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90YXJnZXRfY2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyMTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90YXJnZXRfY2ZnLmMKQEAgLTAsMCArMSw1NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY21zaXMuaCIKKyNpbmNsdWRlICJ1dGlsaXRpZXMuaCIKKyNpbmNsdWRlICJ0YXJnZXRfY2ZnLmgiCisjaW5jbHVkZSAiRHJpdmVyX1BQQy5oIgorI2luY2x1ZGUgIkRyaXZlcl9NUEMuaCIKKyNpbmNsdWRlICJyZWdpb25fZGVmcy5oIgorI2luY2x1ZGUgInRmbV9wbGF0X2RlZnMuaCIKKyNpbmNsdWRlICJyZWdpb24uaCIKKyNpbmNsdWRlICJkZXZpY2VfZGVmaW5pdGlvbi5oIgorI2luY2x1ZGUgInN5c2NvdW50ZXJfYXJtdjgtbV9jbnRybF9kcnYuaCIKKyNpbmNsdWRlICJ1YXJ0X3N0ZG91dC5oIgorCisvKiBUaHJvdyBvdXQgYnVzIGVycm9yIHdoZW4gYW4gYWNjZXNzIGNhdXNlcyBzZWN1cml0eSB2aW9sYXRpb24gKi8KKyNkZWZpbmUgQ01TREtfU0VDUkVTUENGR19CVVNfRVJSX01BU0sgICAoMVVMIDw8IDApCisKKy8qIFRoZSBzZWN0aW9uIG5hbWVzIGNvbWUgZnJvbSB0aGUgc2NhdHRlciBmaWxlICovCitSRUdJT05fREVDTEFSRShMb2FkJCRMUiQkLCBMUl9OU19QQVJUSVRJT04sICQkQmFzZSk7CitSRUdJT05fREVDTEFSRShMb2FkJCRMUiQkLCBMUl9WRU5FRVIsICQkQmFzZSk7CitSRUdJT05fREVDTEFSRShMb2FkJCRMUiQkLCBMUl9WRU5FRVIsICQkTGltaXQpOworCitjb25zdCBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9saW1pdHMgbWVtb3J5X3JlZ2lvbnMgPSB7CisgICAgLm5vbl9zZWN1cmVfY29kZV9zdGFydCA9CisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoTG9hZCQkTFIkJCwgTFJfTlNfUEFSVElUSU9OLCAkJEJhc2UpICsKKyAgICAgICAgQkwyX0hFQURFUl9TSVpFLAorCisgICAgLm5vbl9zZWN1cmVfcGFydGl0aW9uX2Jhc2UgPQorICAgICAgICAodWludDMyX3QpJlJFR0lPTl9OQU1FKExvYWQkJExSJCQsIExSX05TX1BBUlRJVElPTiwgJCRCYXNlKSwKKworICAgIC5ub25fc2VjdXJlX3BhcnRpdGlvbl9saW1pdCA9CisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoTG9hZCQkTFIkJCwgTFJfTlNfUEFSVElUSU9OLCAkJEJhc2UpICsKKyAgICAgICAgTlNfUEFSVElUSU9OX1NJWkUgLSAxLAorCisgICAgLnZlbmVlcl9iYXNlID0gKHVpbnQzMl90KSZSRUdJT05fTkFNRShMb2FkJCRMUiQkLCBMUl9WRU5FRVIsICQkQmFzZSksCisgICAgLnZlbmVlcl9saW1pdCA9ICh1aW50MzJfdCkmUkVHSU9OX05BTUUoTG9hZCQkTFIkJCwgTFJfVkVORUVSLCAkJExpbWl0KSwKK307CisKKy8qIENvbmZpZ3VyZXMgdGhlIFJBTSByZWdpb24gdG8gTlMgY2FsbGFibGUgaW4gc2FjZmcgYmxvY2sncyBuc2NjZmcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkFNTlNDICAweDIKKy8qIENvbmZpZ3VyZXMgdGhlIENPREUgcmVnaW9uIHRvIE5TIGNhbGxhYmxlIGluIHNhY2ZnIGJsb2NrJ3MgbnNjY2ZnIHJlZ2lzdGVyICovCisjZGVmaW5lIENPREVOU0MgIDB4MQorCisvKiBJbXBvcnQgTVBDIGRyaXZlcnMgKi8KK2V4dGVybiBBUk1fRFJJVkVSX01QQyBEcml2ZXJfSVNSQU0wX01QQzsKK2V4dGVybiBBUk1fRFJJVkVSX01QQyBEcml2ZXJfSVNSQU0xX01QQzsKK2V4dGVybiBBUk1fRFJJVkVSX01QQyBEcml2ZXJfU1JBTV9NUEM7CitleHRlcm4gQVJNX0RSSVZFUl9NUEMgRHJpdmVyX1FTUElfTVBDOworCisvKiBJbXBvcnQgUFBDIGRyaXZlcnMgKi8KK2V4dGVybiBEUklWRVJfUFBDX1BPTEFSSVMgRHJpdmVyX1BQQ19QT0xBUklTX01BSU4wOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAwOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAxOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAyOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAzOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMDsKK2V4dGVybiBEUklWRVJfUFBDX1BPTEFSSVMgRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSDE7CitleHRlcm4gRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMDsKK2V4dGVybiBEUklWRVJfUFBDX1BPTEFSSVMgRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAxOworZXh0ZXJuIERSSVZFUl9QUENfUE9MQVJJUyBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDI7CitleHRlcm4gRFJJVkVSX1BQQ19QT0xBUklTIERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMzsKKworLyogRGVmaW5lIFBlcmlwaGVyYWxzIE5TIGFkZHJlc3MgcmFuZ2UgZm9yIHRoZSBwbGF0Zm9ybSAqLworI2RlZmluZSBQRVJJUEhFUkFMU19CQVNFX05TX1NUQVJUICAgICAgKDB4NDAwMDAwMDApCisjZGVmaW5lIFBFUklQSEVSQUxTX0JBU0VfTlNfRU5EICAgICAgICAoMHg0RkZGRkZGRikKKworLyogRW5hYmxlIHN5c3RlbSByZXNldCByZXF1ZXN0IGZvciBDUFUgMCAqLworI2RlZmluZSBFTkFCTEVfQ1BVMF9TWVNURU1fUkVTRVRfUkVRVUVTVCAoMVUgPDwgOFUpCisKKy8qIFRvIHdyaXRlIGludG8gQUlSQ1IgcmVnaXN0ZXIsIDB4NUZBIHZhbHVlIG11c3QgYmUgd3JpdGUgdG8gdGhlIFZFQ1RLRVkgZmllbGQsCisgKiBvdGhlcndpc2UgdGhlIHByb2Nlc3NvciBpZ25vcmVzIHRoZSB3cml0ZS4KKyAqLworI2RlZmluZSBTQ0JfQUlSQ1JfV1JJVEVfTUFTSyAoKDB4NUZBVUwgPDwgU0NCX0FJUkNSX1ZFQ1RLRVlfUG9zKSkKKworLyogRGVidWcgY29uZmlndXJhdGlvbiBmbGFncyAqLworI2RlZmluZSBTUE5JREVOX1NFTF9TVEFUVVMgKDB4MDF1IDw8IDcpCisjZGVmaW5lIFNQTklERU5fU1RBVFVTICAgICAoMHgwMXUgPDwgNikKKyNkZWZpbmUgU1BJREVOX1NFTF9TVEFUVVMgICgweDAxdSA8PCA1KQorI2RlZmluZSBTUElERU5fU1RBVFVTICAgICAgKDB4MDF1IDw8IDQpCisjZGVmaW5lIE5JREVOX1NFTF9TVEFUVVMgICAoMHgwMXUgPDwgMykKKyNkZWZpbmUgTklERU5fU1RBVFVTICAgICAgICgweDAxdSA8PCAyKQorI2RlZmluZSBEQkdFTl9TRUxfU1RBVFVTICAgKDB4MDF1IDw8IDEpCisjZGVmaW5lIERCR0VOX1NUQVRVUyAgICAgICAoMHgwMXUgPDwgMCkKKworI2RlZmluZSBBbGxfU0VMX1NUQVRVUyAoU1BOSURFTl9TRUxfU1RBVFVTIHwgU1BJREVOX1NFTF9TVEFUVVMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBOSURFTl9TRUxfU1RBVFVTIHwgREJHRU5fU0VMX1NUQVRVUykKKworc3RydWN0IHBsYXRmb3JtX2RhdGFfdCB0Zm1fcGVyaXBoZXJhbF9zdGRfdWFydCA9IHsKKyAgICAgICAgVUFSVDBfQkFTRV9OUywKKyAgICAgICAgVUFSVDBfQkFTRV9OUyArIDB4RkZGLAorICAgICAgICBQUENfU1BfRE9fTk9UX0NPTkZJR1VSRSwKKyAgICAgICAgLTEKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kYXRhX3QgdGZtX3BlcmlwaGVyYWxfdGltZXIwID0geworICAgICAgICBTWVNUSU1FUjBfQVJNVjhfTV9CQVNFX1MsCisgICAgICAgIFNZU1RJTUVSMF9BUk1WOF9NX0JBU0VfUyArIDB4RkZGLAorICAgICAgICBQUENfU1BfUEVSSVBIMCwKKyAgICAgICAgU1lTVEVNX1RJTUVSMF9QRVJJUEhfUFBDMF9QT1NfTUFTSworfTsKKworc3RhdGljIERSSVZFUl9QUENfUE9MQVJJUyAqY29uc3QgcHBjX2JhbmtfZHJpdmVyc1tdID0geworICAgICZEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTjAsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDAsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDEsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDIsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDMsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19QRVJJUEgwLAorICAgICZEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMSwKKyAgICAmRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAwLAorICAgICZEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDEsCisgICAgJkRyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMiwKKyAgICAmRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAzLAorfTsKKworI2RlZmluZSBQUENfQkFOS19DT1VOVCAoc2l6ZW9mKHBwY19iYW5rX2RyaXZlcnMpL3NpemVvZihwcGNfYmFua19kcml2ZXJzWzBdKSkKKworZW51bSB0Zm1fcGxhdF9lcnJfdCBlbmFibGVfZmF1bHRfaGFuZGxlcnModm9pZCkKK3sKKyAgICAvKiBFeHBsaWNpdGx5IHNldCBzZWN1cmUgZmF1bHQgcHJpb3JpdHkgdG8gdGhlIGhpZ2hlc3QgKi8KKyAgICBOVklDX1NldFByaW9yaXR5KFNlY3VyZUZhdWx0X0lSUW4sIDApOworCisgICAgLyogRW5hYmxlcyBCVVMsIE1FTSwgVVNHIGFuZCBTZWN1cmUgZmF1bHRzICovCisgICAgU0NCLT5TSENTUiB8PSBTQ0JfU0hDU1JfVVNHRkFVTFRFTkFfTXNrCisgICAgICAgICAgICAgICAgICB8IFNDQl9TSENTUl9CVVNGQVVMVEVOQV9Nc2sKKyAgICAgICAgICAgICAgICAgIHwgU0NCX1NIQ1NSX01FTUZBVUxURU5BX01zaworICAgICAgICAgICAgICAgICAgfCBTQ0JfU0hDU1JfU0VDVVJFRkFVTFRFTkFfTXNrOworICAgIHJldHVybiBURk1fUExBVF9FUlJfU1VDQ0VTUzsKK30KKworZW51bSB0Zm1fcGxhdF9lcnJfdCBzeXN0ZW1fcmVzZXRfY2ZnKHZvaWQpCit7CisgICAgc3RydWN0IHBvbGFyaXNfc3lzY3RybF90ICpzeXNjdHJsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHBvbGFyaXNfc3lzY3RybF90ICopUE9MQVJJU19TWVNDVFJMX0JBU0VfUzsKKyAgICB1aW50MzJfdCByZWdfdmFsdWUgPSBTQ0ItPkFJUkNSOworCisgICAgLyogRW5hYmxlIHN5c3RlbSByZXNldCByZXF1ZXN0IGZvciBDUFUgMCwgdG8gYmUgdHJpZ2dlcmVkIHZpYQorICAgICAqIE5WSUNfU3lzdGVtUmVzZXQgZnVuY3Rpb24uCisgICAgICovCisgICAgc3lzY3RybC0+cmVzZXRfbWFzayB8PSBFTkFCTEVfQ1BVMF9TWVNURU1fUkVTRVRfUkVRVUVTVDsKKworICAgIC8qIENsZWFyIFNDQl9BSVJDUl9WRUNUS0VZIHZhbHVlICovCisgICAgcmVnX3ZhbHVlICY9IH4odWludDMyX3QpKFNDQl9BSVJDUl9WRUNUS0VZX01zayk7CisKKyAgICAvKiBFbmFibGUgc3lzdGVtIHJlc2V0IHJlcXVlc3Qgb25seSB0byB0aGUgc2VjdXJlIHdvcmxkICovCisgICAgcmVnX3ZhbHVlIHw9ICh1aW50MzJfdCkoU0NCX0FJUkNSX1dSSVRFX01BU0sgfCBTQ0JfQUlSQ1JfU1lTUkVTRVRSRVFTX01zayk7CisKKyAgICBTQ0ItPkFJUkNSID0gcmVnX3ZhbHVlOworCisgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOVklDIGludGVycnVwdCBOUy9TIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZW51bSB0Zm1fcGxhdF9lcnJfdCBudmljX2ludGVycnVwdF90YXJnZXRfc3RhdGVfY2ZnKHZvaWQpCit7CisgICAgdWludDhfdCBpOworCisgICAgLyogVGFyZ2V0IGV2ZXJ5IGludGVycnVwdCB0byBOUzsgdW5pbXBsZW1lbnRlZCBpbnRlcnJ1cHRzIHdpbGwgYmUgV0kgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihOVklDLT5JVE5TKSAvIHNpemVvZihOVklDLT5JVE5TWzBdKSk7IGkrKykgeworICAgICAgICBOVklDLT5JVE5TW2ldID0gMHhGRkZGRkZGRjsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBNUEMgYW5kIFBQQyBhcmUgdGFyZ2V0ZWQgdG8gUyBzdGF0ZSAqLworICAgIE5WSUNfQ2xlYXJUYXJnZXRTdGF0ZShNUENfSVJRbik7CisgICAgTlZJQ19DbGVhclRhcmdldFN0YXRlKFBQQ19JUlFuKTsKKworI2lmZGVmIFNFQ1VSRV9VQVJUMQorICAgIC8qIFVBUlQxIGlzIGEgc2VjdXJlIHBlcmlwaGVyYWwsIHNvIGl0cyBJUlFzIGhhdmUgdG8gdGFyZ2V0IFMgc3RhdGUgKi8KKyAgICBOVklDX0NsZWFyVGFyZ2V0U3RhdGUoVUFSVFJYMV9JUlFuKTsKKyAgICBOVklDX0NsZWFyVGFyZ2V0U3RhdGUoVUFSVFRYMV9JUlFuKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9TVUNDRVNTOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tIE5WSUMgaW50ZXJydXB0IGVuYWJsaW5nIGZvciBTIHBlcmlwaGVyYWxzIC0tLS0tLS0tLS0tLS0tLS0qLworZW51bSB0Zm1fcGxhdF9lcnJfdCBudmljX2ludGVycnVwdF9lbmFibGUodm9pZCkKK3sKKyAgICBpbnQzMl90IHJldCA9IEFSTV9EUklWRVJfT0s7CisgICAgaW50MzJfdCBpID0gMDsKKworICAgIC8qIE1QQyBpbnRlcnJ1cHQgZW5hYmxpbmcgKi8KKyAgICBtcGNfY2xlYXJfaXJxKCk7CisgICAgcmV0ID0gRHJpdmVyX0lTUkFNMF9NUEMuRW5hYmxlSW50ZXJydXB0KCk7CisgICAgaWYgKHJldCAhPSBBUk1fRFJJVkVSX09LKSB7CisgICAgICAgIEVSUk9SX01TRygiRmFpbGVkIHRvIEVuYWJsZSBNUEMgaW50ZXJydXB0IGZvciBJU1JBTTAhIik7CisgICAgICAgIHJldHVybiBURk1fUExBVF9FUlJfU1lTVEVNX0VSUjsKKyAgICB9CisKKyAgICByZXQgPSBEcml2ZXJfU1JBTV9NUEMuRW5hYmxlSW50ZXJydXB0KCk7CisgICAgaWYgKHJldCAhPSBBUk1fRFJJVkVSX09LKSB7CisgICAgICAgIEVSUk9SX01TRygiRmFpbGVkIHRvIEVuYWJsZSBNUEMgaW50ZXJydXB0IGZvciBTUkFNISIpOworICAgICAgICByZXR1cm4gVEZNX1BMQVRfRVJSX1NZU1RFTV9FUlI7CisgICAgfQorCisgICAgTlZJQ19DbGVhclBlbmRpbmdJUlEoTVBDX0lSUW4pOworICAgIE5WSUNfRW5hYmxlSVJRKE1QQ19JUlFuKTsKKworICAgIC8qIFBQQyBpbnRlcnJ1cHQgZW5hYmxpbmcgKi8KKyAgICBwcGNfY2xlYXJfaXJxKCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUFBDX0JBTktfQ09VTlQ7IGkrKykgIHsKKyAgICAgICAgcmV0ID0gcHBjX2JhbmtfZHJpdmVyc1tpXS0+RW5hYmxlSW50ZXJydXB0KCk7CisgICAgICAgIGlmIChyZXQgIT0gQVJNX0RSSVZFUl9PSykgeworICAgICAgICAgICAgRVJST1JfTVNHKCJGYWlsZWQgdG8gRW5hYmxlIGludGVycnVwdCBvbiBQUEMiKTsKKyAgICAgICAgICAgIHJldHVybiBURk1fUExBVF9FUlJfU1lTVEVNX0VSUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIE5WSUNfQ2xlYXJQZW5kaW5nSVJRKFBQQ19JUlFuKTsKKyAgICBOVklDX0VuYWJsZUlSUShQUENfSVJRbik7CisKKyNpZmRlZiBQU0FfRkZfVEVTVF9TRUNVUkVfVUFSVDIKKyAgICBOVklDX0VuYWJsZUlSUShGRl9URVNUX1VBUlRfSVJRKTsKKyNlbmRpZgorICAgIHJldHVybiBURk1fUExBVF9FUlJfU1VDQ0VTUzsKK30KKworZW51bSB0Zm1fcGxhdF9lcnJfdCBpbml0X2RlYnVnKHZvaWQpCit7CisgICAgc3RydWN0IHBvbGFyaXNfc3lzY3RybF90ICpzeXNjdHJsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHBvbGFyaXNfc3lzY3RybF90ICopUE9MQVJJU19TWVNDVFJMX0JBU0VfUzsKKworI2lmIGRlZmluZWQoREFVVEhfTk9ORSkKKyAgICAvKiBTZXQgYWxsIHRoZSBkZWJ1ZyBlbmFibGUgc2VsZWN0b3IgYml0cyB0byAxICovCisgICAgc3lzY3RybC0+c2VjZGJnc2V0ID0gQWxsX1NFTF9TVEFUVVM7CisgICAgLyogU2V0IGFsbCB0aGUgZGVidWcgZW5hYmxlIGJpdHMgdG8gMCAqLworICAgIHN5c2N0cmwtPnNlY2RiZ2NsciA9CisgICAgICAgICAgICAgICAgICAgREJHRU5fU1RBVFVTIHwgTklERU5fU1RBVFVTIHwgU1BJREVOX1NUQVRVUyB8IFNQTklERU5fU1RBVFVTOworI2VsaWYgZGVmaW5lZChEQVVUSF9OU19PTkxZKQorICAgIC8qIFNldCBhbGwgdGhlIGRlYnVnIGVuYWJsZSBzZWxlY3RvciBiaXRzIHRvIDEgKi8KKyAgICBzeXNjdHJsLT5zZWNkYmdzZXQgPSBBbGxfU0VMX1NUQVRVUzsKKyAgICAvKiBTZXQgdGhlIGRlYnVnIGVuYWJsZSBiaXRzIHRvIDEgZm9yIE5TLCBhbmQgMCBmb3IgUyBtb2RlICovCisgICAgc3lzY3RybC0+c2VjZGJnc2V0ID0gREJHRU5fU1RBVFVTIHwgTklERU5fU1RBVFVTOworICAgIHN5c2N0cmwtPnNlY2RiZ2NsciA9IFNQSURFTl9TVEFUVVMgfCBTUE5JREVOX1NUQVRVUzsKKyNlbGlmIGRlZmluZWQoREFVVEhfRlVMTCkKKyAgICAvKiBTZXQgYWxsIHRoZSBkZWJ1ZyBlbmFibGUgc2VsZWN0b3IgYml0cyB0byAxICovCisgICAgc3lzY3RybC0+c2VjZGJnc2V0ID0gQWxsX1NFTF9TVEFUVVM7CisgICAgLyogU2V0IGFsbCB0aGUgZGVidWcgZW5hYmxlIGJpdHMgdG8gMSAqLworICAgIHN5c2N0cmwtPnNlY2RiZ3NldCA9CisgICAgICAgICAgICAgICAgICAgREJHRU5fU1RBVFVTIHwgTklERU5fU1RBVFVTIHwgU1BJREVOX1NUQVRVUyB8IFNQTklERU5fU1RBVFVTOworI2Vsc2UKKworI2lmICFkZWZpbmVkKERBVVRIX0NISVBfREVGQVVMVCkKKyNlcnJvciAiTm8gZGVidWcgYXV0aGVudGljYXRpb24gc2V0dGluZyBpcyBwcm92aWRlZC4iCisjZW5kaWYKKworICAgIC8qIFNldCBhbGwgdGhlIGRlYnVnIGVuYWJsZSBzZWxlY3RvciBiaXRzIHRvIDAgKi8KKyAgICBzeXNjdHJsLT5zZWNkYmdjbHIgPSBBbGxfU0VMX1NUQVRVUzsKKworICAgIC8qIE5vIG5lZWQgdG8gc2V0IGFueSBlbmFibGUgYml0cyBiZWNhdXNlIHRoZSB2YWx1ZSBkZXBlbmRzIG9uCisgICAgICogaW5wdXQgc2lnbmFscy4KKyAgICAgKi8KKyNlbmRpZgorICAgIHJldHVybiBURk1fUExBVF9FUlJfU1VDQ0VTUzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tIFNBVS9JREFVIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgc2F1X2FuZF9pZGF1X2NmZyh2b2lkKQoreworICAgIHN0cnVjdCBwb2xhcmlzX3NhY2ZnX3QgKnNhY2ZnID0gKHN0cnVjdCBwb2xhcmlzX3NhY2ZnX3QqKVBPTEFSSVNfU0FDRkdfQkFTRV9TOworCisgICAgLyogRW5hYmxlcyBTQVUgKi8KKyAgICBUWl9TQVVfRW5hYmxlKCk7CisKKyAgICAvKiBDb25maWd1cmVzIFNBVSByZWdpb25zIHRvIGJlIG5vbi1zZWN1cmUgKi8KKyAgICBTQVUtPlJOUiAgPSAwOworICAgIFNBVS0+UkJBUiA9IChtZW1vcnlfcmVnaW9ucy5ub25fc2VjdXJlX3BhcnRpdGlvbl9iYXNlCisgICAgICAgICAgICAgICAgICYgU0FVX1JCQVJfQkFERFJfTXNrKTsKKyAgICBTQVUtPlJMQVIgPSAobWVtb3J5X3JlZ2lvbnMubm9uX3NlY3VyZV9wYXJ0aXRpb25fbGltaXQKKyAgICAgICAgICAgICAgICAgICYgU0FVX1JMQVJfTEFERFJfTXNrKSB8IFNBVV9STEFSX0VOQUJMRV9Nc2s7CisKKyAgICBTQVUtPlJOUiAgPSAxOworICAgIFNBVS0+UkJBUiA9IChOU19EQVRBX1NUQVJUICYgU0FVX1JCQVJfQkFERFJfTXNrKTsKKyAgICBTQVUtPlJMQVIgPSAoTlNfREFUQV9MSU1JVCAmIFNBVV9STEFSX0xBRERSX01zaykgfCBTQVVfUkxBUl9FTkFCTEVfTXNrOworCisgICAgLyogQ29uZmlndXJlcyB2ZW5lZXJzIHJlZ2lvbiB0byBiZSBub24tc2VjdXJlIGNhbGxhYmxlICovCisgICAgU0FVLT5STlIgID0gMjsKKyAgICBTQVUtPlJCQVIgPSAobWVtb3J5X3JlZ2lvbnMudmVuZWVyX2Jhc2UgJiBTQVVfUkJBUl9CQUREUl9Nc2spOworICAgIFNBVS0+UkxBUiA9IChtZW1vcnlfcmVnaW9ucy52ZW5lZXJfbGltaXQgJiBTQVVfUkxBUl9MQUREUl9Nc2spCisgICAgICAgICAgICAgICAgIHwgU0FVX1JMQVJfRU5BQkxFX01zayB8IFNBVV9STEFSX05TQ19Nc2s7CisKKyAgICAvKiBDb25maWd1cmUgdGhlIHBlcmlwaGVyYWxzIHNwYWNlICovCisgICAgU0FVLT5STlIgID0gMzsKKyAgICBTQVUtPlJCQVIgPSAoUEVSSVBIRVJBTFNfQkFTRV9OU19TVEFSVCAmIFNBVV9SQkFSX0JBRERSX01zayk7CisgICAgU0FVLT5STEFSID0gKFBFUklQSEVSQUxTX0JBU0VfTlNfRU5EICYgU0FVX1JMQVJfTEFERFJfTXNrKQorICAgICAgICAgICAgICAgICAgfCBTQVVfUkxBUl9FTkFCTEVfTXNrOworCisgICAgLyogQWxsb3dzIFNBVSB0byBkZWZpbmUgdGhlIENPREUgcmVnaW9uIGFzIGEgTlNDICovCisgICAgc2FjZmctPm5zY2NmZyB8PSBDT0RFTlNDOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZW51bSB0Zm1fcGxhdF9lcnJfdCBtcGNfaW5pdF9jZmcodm9pZCkKK3sKKyAgICBpbnQzMl90IHJldCA9IEFSTV9EUklWRVJfT0s7CisKKyAgICAvKiBJU1JBTTAgaXMgYWxsb2NhdGVkIGZvciBOUyBkYXRhLCBzbyB3aG9sZSByYW5nZSBpcyBzZXQgdG8gbm9uLXNlY3VyZQorICAgICAqIGFjY2VzaWJsZS4gKi8KKyAgICByZXQgPSBEcml2ZXJfSVNSQU0wX01QQy5Jbml0aWFsaXplKCk7CisgICAgaWYgKHJldCAhPSBBUk1fRFJJVkVSX09LKSB7CisgICAgICAgIEVSUk9SX01TRygiRmFpbGVkIHRvIEluaXRpYWxpemUgTVBDIGZvciBJU1JBTTAhIik7CisgICAgICAgIHJldHVybiBURk1fUExBVF9FUlJfU1lTVEVNX0VSUjsKKyAgICB9CisgICAgcmV0ID0gRHJpdmVyX0lTUkFNMF9NUEMuQ29uZmlnUmVnaW9uKE1QQ19JU1JBTTBfUkFOR0VfQkFTRV9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBDX0lTUkFNMF9SQU5HRV9MSU1JVF9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJNX01QQ19BVFRSX05PTlNFQ1VSRSk7CisgICAgaWYgKHJldCAhPSBBUk1fRFJJVkVSX09LKSB7CisgICAgICAgIEVSUk9SX01TRygiRmFpbGVkIHRvIENvbmZpZ3VyZSBNUEMgZm9yIElTUkFNMCEiKTsKKyAgICAgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9TWVNURU1fRVJSOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyaW5nIHByaW1hcnkgYW5kIHNlY29uZGFyeSBub24tc2VjdXJlIHBhcnRpdGlvbi4KKyAgICAgKiBJdCBpcyBlbnN1cmVkIGluIGZsYXNoX2xheW91dC5oIHRoYXQgdGhlc2UgbWVtb3J5IHJlZ2lvbnMgYXJlIGxvY2F0ZWQgaW4KKyAgICAgKiBTUkFNIFNSQU0gZGV2aWNlLiAqLworICAgIHJldCA9IERyaXZlcl9TUkFNX01QQy5Jbml0aWFsaXplKCk7CisgICAgaWYgKHJldCAhPSBBUk1fRFJJVkVSX09LKSB7CisgICAgICAgIEVSUk9SX01TRygiRmFpbGVkIHRvIEluaXRpYWxpemUgTVBDIGZvciBTUkFNISIpOworICAgICAgICByZXR1cm4gVEZNX1BMQVRfRVJSX1NZU1RFTV9FUlI7CisgICAgfQorICAgIHJldCA9IERyaXZlcl9TUkFNX01QQy5Db25maWdSZWdpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9yZWdpb25zLm5vbl9zZWN1cmVfcGFydGl0aW9uX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9yZWdpb25zLm5vbl9zZWN1cmVfcGFydGl0aW9uX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX0FUVFJfTk9OU0VDVVJFKTsKKyAgICBpZiAocmV0ICE9IEFSTV9EUklWRVJfT0spIHsKKyAgICAgICAgRVJST1JfTVNHKCJGYWlsZWQgdG8gQ29uZmlndXJlIE1QQyBmb3IgU1JBTSEiKTsKKyAgICAgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9TWVNURU1fRVJSOworICAgIH0KKworICAgIC8qIExvY2sgZG93biBub3QgdXNlZCBNUEMncyAqLworICAgIERyaXZlcl9RU1BJX01QQy5Mb2NrRG93bigpOworICAgIERyaXZlcl9JU1JBTTFfTVBDLkxvY2tEb3duKCk7CisKKyAgICAvKiBTUkFNIGFuZCBJU1JBTTAgTVBDcyBsZWZ0IHVubG9ja2VkIGFzIHRoZXkgYXJlIG5vdCByZXNldCBpZiBOVklDIHN5c3RlbQorICAgICAqIHJlc2V0IGFzc2VydGVkLgorICAgICAqLworCisgICAgLyogQWRkIGJhcnJpZXJzIHRvIGFzc3VyZSB0aGUgTVBDIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBiZWZvcmUgY29udGludWUKKyAgICAgKiB0aGUgZXhlY3V0aW9uLgorICAgICAqLworICAgIF9fRFNCKCk7CisgICAgX19JU0IoKTsKKworICAgIHJldHVybiBURk1fUExBVF9FUlJfU1VDQ0VTUzsKK30KKwordm9pZCBtcGNfcmV2ZXJ0X25vbl9zZWN1cmVfdG9fc2VjdXJlX2NmZyh2b2lkKQoreworICAgIERyaXZlcl9JU1JBTTBfTVBDLkNvbmZpZ1JlZ2lvbihNUENfSVNSQU0wX1JBTkdFX0JBU0VfUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBDX0lTUkFNMF9SQU5HRV9MSU1JVF9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUk1fTVBDX0FUVFJfU0VDVVJFKTsKKworICAgIERyaXZlcl9TUkFNX01QQy5Db25maWdSZWdpb24oTVBDX1NSQU1fUkFOR0VfQkFTRV9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBDX1NSQU1fUkFOR0VfTElNSVRfUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSTV9NUENfQVRUUl9TRUNVUkUpOworCisgICAgLyogQWRkIGJhcnJpZXJzIHRvIGFzc3VyZSB0aGUgTVBDIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBiZWZvcmUgY29udGludWUKKyAgICAgKiB0aGUgZXhlY3V0aW9uLgorICAgICAqLworICAgIF9fRFNCKCk7CisgICAgX19JU0IoKTsKK30KKwordm9pZCBtcGNfY2xlYXJfaXJxKHZvaWQpCit7CisgICAgRHJpdmVyX0lTUkFNMF9NUEMuQ2xlYXJJbnRlcnJ1cHQoKTsKKyAgICBEcml2ZXJfU1JBTV9NUEMuQ2xlYXJJbnRlcnJ1cHQoKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tIFBQQyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VudW0gdGZtX3BsYXRfZXJyX3QgcHBjX2luaXRfY2ZnKHZvaWQpCit7CisgICAgc3RydWN0IHBvbGFyaXNfc2FjZmdfdCAqc2FjZmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHBvbGFyaXNfc2FjZmdfdCopUE9MQVJJU19TQUNGR19CQVNFX1M7CisgICAgaW50MzJfdCBlcnIgPSBBUk1fRFJJVkVSX09LOworCisgICAgLyogR3JhbnQgbm9uLXNlY3VyZSBhY2Nlc3MgdG8gcGVyaXBoZXJhbHMgb24gTUFJTiBFWFAwICovCisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDAuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAwLkNvbmZpZ1NlY3VyaXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8wX01BSU5fUFBDRVhQMF9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPMV9NQUlOX1BQQ0VYUDBfUE9TX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfTk9OU0VDVVJFX0NPTkZJRyk7CisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDAuQ29uZmlnU2VjdXJpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJTzJfTUFJTl9QUENFWFAwX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAwLkNvbmZpZ1NlY3VyaXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU8zX01BSU5fUFBDRVhQMF9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfQU5EX0VUSEVSTkVUX01BSU5fUFBDRVhQMF9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKworICAgIC8qIEdyYW50IG5vbi1zZWN1cmUgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIG9uIE1BSU4gRVhQMSAqLworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfTUFJTl9FWFAxLkluaXRpYWxpemUoKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMS5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUExX01BSU5fUFBDRVhQMV9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMS5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUEyX01BSU5fUFBDRVhQMV9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMS5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUEzX01BSU5fUFBDRVhQMV9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKworICAgIC8qIEdyYW50IG5vbi1zZWN1cmUgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIG9uIFBFUklQSDAgKi8KKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSDAuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fVElNRVIwX1BFUklQSF9QUEMwX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fVElNRVIxX1BFUklQSF9QUEMwX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fVElNRVIyX1BFUklQSF9QUEMwX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fVElNRVIzX1BFUklQSF9QUEMwX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMC5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVRDSERPR19QRVJJUEhfUFBDMF9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKworICAgIC8qIEdyYW50IG5vbi1zZWN1cmUgYWNjZXNzIHRvIHBlcmlwaGVyYWxzIG9uIFBFUklQSDEgKi8KKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSDEuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIMS5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTE9XQ0xLX1RJTUVSX1BFUklQSF9QUEMxX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworCisgICAgLyogR3JhbnQgbm9uLXNlY3VyZSBhY2Nlc3MgdG8gcGVyaXBoZXJhbHMgb24gUEVSSVBIIEVYUDIgKi8KKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAyLkluaXRpYWxpemUoKTsKKworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDIuQ29uZmlnU2VjdXJpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBHQV9JMlNfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfTk9OU0VDVVJFX0NPTkZJRyk7CisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMi5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUEdBX0lPX1BFUklQSF9QUENFWFAyX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDIuQ29uZmlnU2VjdXJpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDBfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfTk9OU0VDVVJFX0NPTkZJRyk7CisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMi5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMV9QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAyLkNvbmZpZ1NlY3VyaXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQyX1BFUklQSF9QUENFWFAyX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDIuQ29uZmlnU2VjdXJpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDNfUEVSSVBIX1BQQ0VYUDJfUE9TX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfTk9OU0VDVVJFX0NPTkZJRyk7CisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19QRVJJUEhfRVhQMi5Db25maWdTZWN1cml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUNF9QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAyLkNvbmZpZ1NlY3VyaXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQ1X1BFUklQSF9QUENFWFAyX1BPU19NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDIuQ29uZmlnU2VjdXJpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xDRF9QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHKTsKKworICAgIC8qIEdyYW50IHVuLXByaXZpbGVnZWQgYWNjZXNzIGZvciBVQVJUMCBpbiBOUyBkb21haW4gKi8KKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX1BFUklQSF9FWFAyLkNvbmZpZ1ByaXZpbGVnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMF9QRVJJUEhfUFBDRVhQMl9QT1NfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19OT05TRUNVUkVfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1BSSVZfQU5EX05PTlBSSVZfQ09ORklHKTsKKworICAgIC8qIEluaXRpYWxpemUgbm90IHVzZWQgUFBDIGRyaXZlcnMgKi8KKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU4wLkluaXRpYWxpemUoKTsKKyAgICBlcnIgfD0gRHJpdmVyX1BQQ19QT0xBUklTX01BSU5fRVhQMi5Jbml0aWFsaXplKCk7CisgICAgZXJyIHw9IERyaXZlcl9QUENfUE9MQVJJU19NQUlOX0VYUDMuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDAuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDEuSW5pdGlhbGl6ZSgpOworICAgIGVyciB8PSBEcml2ZXJfUFBDX1BPTEFSSVNfUEVSSVBIX0VYUDMuSW5pdGlhbGl6ZSgpOworCisgICAgLyoKKyAgICAgKiBDb25maWd1cmUgdGhlIHJlc3BvbnNlIHRvIGEgc2VjdXJpdHkgdmlvbGF0aW9uIGFzIGEKKyAgICAgKiBidXMgZXJyb3IgaW5zdGVhZCBvZiBSQVovV0kKKyAgICAgKi8KKyAgICBzYWNmZy0+c2VjcmVzcGNmZyB8PSBDTVNES19TRUNSRVNQQ0ZHX0JVU19FUlJfTUFTSzsKKworICAgIGlmIChlcnIgIT0gQVJNX0RSSVZFUl9PSykgeworICAgICAgICByZXR1cm4gVEZNX1BMQVRfRVJSX1NZU1RFTV9FUlI7CisgICAgfQorCisgICAgcmV0dXJuIFRGTV9QTEFUX0VSUl9TVUNDRVNTOworfQorCit2b2lkIHBwY19jb25maWd1cmVfdG9fc2VjdXJlKGVudW0gcHBjX2JhbmtfZSBiYW5rLCB1aW50MzJfdCBwb3MpCit7CisgICAgRFJJVkVSX1BQQ19QT0xBUklTICpwcGNfZHJpdmVyOworCisgICAgaWYgKGJhbmsgPj0gUFBDX0JBTktfQ09VTlQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBwY19kcml2ZXIgPSBwcGNfYmFua19kcml2ZXJzW2JhbmtdOworICAgIGlmIChwcGNfZHJpdmVyKSB7CisgICAgICAgIHBwY19kcml2ZXItPkNvbmZpZ1NlY3VyaXR5KHBvcywgUFBDX1BPTEFSSVNfU0VDVVJFX0NPTkZJRyk7CisgICAgfQorfQorCit2b2lkIHBwY19jb25maWd1cmVfdG9fbm9uX3NlY3VyZShlbnVtIHBwY19iYW5rX2UgYmFuaywgdWludDMyX3QgcG9zKQoreworICAgIERSSVZFUl9QUENfUE9MQVJJUyAqcHBjX2RyaXZlcjsKKworICAgIGlmIChiYW5rID49IFBQQ19CQU5LX0NPVU5UKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcGNfZHJpdmVyID0gcHBjX2JhbmtfZHJpdmVyc1tiYW5rXTsKKyAgICBpZiAocHBjX2RyaXZlcikgeworICAgICAgICBwcGNfZHJpdmVyLT5Db25maWdTZWN1cml0eShwb3MsIFBQQ19QT0xBUklTX05PTlNFQ1VSRV9DT05GSUcpOworICAgIH0KK30KKwordm9pZCBwcGNfZW5fc2VjdXJlX3VucHJpdihlbnVtIHBwY19iYW5rX2UgYmFuaywgdWludDMyX3QgcG9zKQoreworICAgIERSSVZFUl9QUENfUE9MQVJJUyAqcHBjX2RyaXZlcjsKKworICAgIGlmIChiYW5rID49IFBQQ19CQU5LX0NPVU5UKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcGNfZHJpdmVyID0gcHBjX2JhbmtfZHJpdmVyc1tiYW5rXTsKKyAgICBpZiAocHBjX2RyaXZlcikgeworICAgICAgICBwcGNfZHJpdmVyLT5Db25maWdQcml2aWxlZ2UocG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfU0VDVVJFX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19QT0xBUklTX1BSSVZfQU5EX05PTlBSSVZfQ09ORklHKTsKKyAgICB9Cit9CisKK3ZvaWQgcHBjX2Nscl9zZWN1cmVfdW5wcml2KGVudW0gcHBjX2JhbmtfZSBiYW5rLCB1aW50MzJfdCBwb3MpCit7CisgICAgRFJJVkVSX1BQQ19QT0xBUklTICpwcGNfZHJpdmVyOworCisgICAgaWYgKGJhbmsgPj0gUFBDX0JBTktfQ09VTlQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBwY19kcml2ZXIgPSBwcGNfYmFua19kcml2ZXJzW2JhbmtdOworICAgIGlmIChwcGNfZHJpdmVyKSB7CisgICAgICAgIHBwY19kcml2ZXItPkNvbmZpZ1ByaXZpbGVnZShwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUENfUE9MQVJJU19TRUNVUkVfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX1BPTEFSSVNfUFJJVl9DT05GSUcpOworICAgIH0KK30KKwordm9pZCBwcGNfY2xlYXJfaXJxKHZvaWQpCit7CisgICAgaW50MzJfdCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBQUENfQkFOS19DT1VOVDsgaSsrKSB7CisgICAgICAgIHBwY19iYW5rX2RyaXZlcnNbaV0tPkNsZWFySW50ZXJydXB0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3RhcmdldF9jZmcuaCBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90YXJnZXRfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNGYwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90YXJnZXRfY2ZnLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTktMjAyMSBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVEFSR0VUX0NGR19IX18KKyNkZWZpbmUgX19UQVJHRVRfQ0ZHX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGZtX3BlcmlwaGVyYWxzX2RlZi5oIgorI2luY2x1ZGUgInRmbV9wbGF0X2RlZnMuaCIKKworI2RlZmluZSBURk1fRFJJVkVSX1NURElPICAgIERyaXZlcl9VU0FSVDAKKyNkZWZpbmUgTlNfRFJJVkVSX1NURElPICAgICBEcml2ZXJfVVNBUlQwCisKKy8qKgorICogXGJyaWVmIERlZmluZXMgdGhlIHdvcmQgb2Zmc2V0cyBvZiBTbGF2ZSBQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlcgorICogICAgICAgIFJlZ2lzdGVycworICovCitlbnVtIHBwY19iYW5rX2UKK3sKKyAgICBQUENfU1BfRE9fTk9UX0NPTkZJR1VSRSA9IC0xLAorICAgIFBQQ19TUF9NQUlOMCA9IDAsCisgICAgUFBDX1NQX01BSU5fRVhQMCA9IDEsCisgICAgUFBDX1NQX01BSU5fRVhQMSA9IDIsCisgICAgUFBDX1NQX01BSU5fRVhQMiA9IDMsCisgICAgUFBDX1NQX01BSU5fRVhQMyA9IDQsCisgICAgUFBDX1NQX1BFUklQSDAgPSA1LAorICAgIFBQQ19TUF9QRVJJUEgxID0gNiwKKyAgICBQUENfU1BfUEVSSVBIX0VYUDAgPSA3LAorICAgIFBQQ19TUF9QRVJJUEhfRVhQMSA9IDgsCisgICAgUFBDX1NQX1BFUklQSF9FWFAyID0gOSwKKyAgICBQUENfU1BfUEVSSVBIX0VYUDMgPSAxMCwKK307CisKKy8qKgorICogXGJyaWVmIFN0b3JlIHRoZSBhZGRyZXNzZXMgb2YgbWVtb3J5IHJlZ2lvbnMKKyAqLworc3RydWN0IG1lbW9yeV9yZWdpb25fbGltaXRzIHsKKyAgICB1aW50MzJfdCBub25fc2VjdXJlX2NvZGVfc3RhcnQ7CisgICAgdWludDMyX3Qgbm9uX3NlY3VyZV9wYXJ0aXRpb25fYmFzZTsKKyAgICB1aW50MzJfdCBub25fc2VjdXJlX3BhcnRpdGlvbl9saW1pdDsKKyAgICB1aW50MzJfdCB2ZW5lZXJfYmFzZTsKKyAgICB1aW50MzJfdCB2ZW5lZXJfbGltaXQ7Cit9OworCisvKioKKyAqIFxicmllZiBIb2xkcyB0aGUgZGF0YSBuZWNlc3NhcnkgdG8gZG8gaXNvbGF0aW9uIGZvciBhIHNwZWNpZmljIHBlcmlwaGVyYWwuCisgKi8KK3N0cnVjdCBwbGF0Zm9ybV9kYXRhX3QgeworICAgIHVpbnQzMl90IHBlcmlwaF9zdGFydDsKKyAgICB1aW50MzJfdCBwZXJpcGhfbGltaXQ7CisgICAgZW51bSBwcGNfYmFua19lIHBlcmlwaF9wcGNfYmFuazsKKyAgICBpbnQxNl90IHBlcmlwaF9wcGNfbWFzazsKK307CisKKy8qKgorICogXGJyaWVmIEVuYWJsZXMgdGhlIGZhdWx0IGhhbmRsZXJzIEJ1c0ZhdWx0LCBVc2FnZUZhdWx0LAorICogICAgICAgIE1lbU1hbmFnZUZhdWx0IGFuZCBTZWN1cmVGYXVsdC4KKyAqLworZW51bSB0Zm1fcGxhdF9lcnJfdCBlbmFibGVfZmF1bHRfaGFuZGxlcnModm9pZCk7CisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIHN5c3RlbSByZXNldCByZXF1ZXN0IHByb3BlcnRpZXMKKyAqCisgKiBccmV0dXJuIFJldHVybnMgdmFsdWVzIGFzIHNwZWNpZmllZCBieSB0aGUgXHJlZiB0Zm1fcGxhdF9lcnJfdAorICovCitlbnVtIHRmbV9wbGF0X2Vycl90IHN5c3RlbV9yZXNldF9jZmcodm9pZCk7CisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZXMgYWxsIGV4dGVybmFsIGludGVycnVwdHMgdG8gdGFyZ2V0IHRoZQorICogICAgICAgIE5TIHN0YXRlLCBhcGFydCBmb3IgdGhlIG9uZXMgYXNzb2NpYXRlZCB0byBzZWN1cmUKKyAqICAgICAgICBwZXJpcGhlcmFscyAocGx1cyBNUEMgYW5kIFBQQykKKyAqCisgKiBccmV0dXJuIFJldHVybnMgdmFsdWVzIGFzIHNwZWNpZmllZCBieSB0aGUgXHJlZiB0Zm1fcGxhdF9lcnJfdAorICovCitlbnVtIHRmbV9wbGF0X2Vycl90IG52aWNfaW50ZXJydXB0X3RhcmdldF9zdGF0ZV9jZmcodm9pZCk7CisKKy8qKgorICogXGJyaWVmIFRoaXMgZnVuY3Rpb24gZW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGFzc29jaWF0ZWQKKyAqICAgICAgICB0byB0aGUgc2VjdXJlIHBlcmlwaGVyYWxzIChwbHVzIE1QQyBhbmQgUFBDKQorICoKKyAqIFxyZXR1cm4gUmV0dXJucyB2YWx1ZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBccmVmIHRmbV9wbGF0X2Vycl90CisgKi8KK2VudW0gdGZtX3BsYXRfZXJyX3QgbnZpY19pbnRlcnJ1cHRfZW5hYmxlKHZvaWQpOworCisvKioKKyAqIFxicmllZiBDb25maWd1cmVzIHRoZSBzeXN0ZW0gZGVidWcgcHJvcGVydGllcy4KKyAqCisgKiBccmV0dXJuIFJldHVybnMgdmFsdWVzIGFzIHNwZWNpZmllZCBieSB0aGUgXHJlZiB0Zm1fcGxhdF9lcnJfdAorICovCitlbnVtIHRmbV9wbGF0X2Vycl90IGluaXRfZGVidWcodm9pZCk7CisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZXMgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIuCisgKgorICogXHJldHVybiAgUmV0dXJucyBlcnJvciBjb2RlLgorICovCitlbnVtIHRmbV9wbGF0X2Vycl90IG1wY19pbml0X2NmZyh2b2lkKTsKKworLyoqCisgKiBcYnJpZWYgQ2xlYXIgTVBDIGludGVycnVwdC4KKyAqLwordm9pZCBtcGNfY2xlYXJfaXJxKHZvaWQpOworCisvKioKKyAqIFxicmllZiBDb25maWd1cmVzIHRoZSBQZXJpcGhlcmFsIFByb3RlY3Rpb24gQ29udHJvbGxlci4KKyAqLworZW51bSB0Zm1fcGxhdF9lcnJfdCBwcGNfaW5pdF9jZmcodm9pZCk7CisKKy8qKgorICogXGJyaWVmIFJlc3RpY3QgcGVyaXBoZXJhbCBhY2Nlc3MgdG8gc2VjdXJlIGFjY2VzcyBvbmx5CisgKgorICogXG5vdGUgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbmZpZ3VyZSBwcml2aWxlZ2UKKyAqLwordm9pZCBwcGNfY29uZmlndXJlX3RvX3NlY3VyZShlbnVtIHBwY19iYW5rX2UgYmFuaywgdWludDMyX3QgcG9zKTsKKworLyoqCisgKiBcYnJpZWYgQWxsb3cgbm9uLXNlY3VyZSBhY2Nlc3MgdG8gcGVyaXBoZXJhbAorICoKKyAqIFxub3RlIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb25maWd1cmUgcHJpdmlsZWdlCisgKi8KK3ZvaWQgcHBjX2NvbmZpZ3VyZV90b19ub25fc2VjdXJlKGVudW0gcHBjX2JhbmtfZSBiYW5rLCB1aW50MzJfdCBwb3MpOworCisvKioKKyAqIFxicmllZiBFbmFibGUgc2VjdXJlIHVucHJpdmlsZWdlZCBhY2Nlc3MgdG8gcGVyaXBoZXJhbAorICovCit2b2lkIHBwY19lbl9zZWN1cmVfdW5wcml2KGVudW0gcHBjX2JhbmtfZSBiYW5rLCB1aW50MzJfdCBwb3MpOworCisvKioKKyAqIFxicmllZiBDbGVhciBzZWN1cmUgdW5wcml2aWxlZ2VkIGFjY2VzcyB0byBwZXJpcGhlcmFsCisgKi8KK3ZvaWQgcHBjX2Nscl9zZWN1cmVfdW5wcml2KGVudW0gcHBjX2JhbmtfZSBiYW5rLCB1aW50MzJfdCBwb3MpOworCisvKioKKyAqIFxicmllZiBDbGVhcnMgUFBDIGludGVycnVwdC4KKyAqLwordm9pZCBwcGNfY2xlYXJfaXJxKHZvaWQpOworCisvKioKKyAqIFxicmllZiBDb25maWd1cmVzIFNBVSBhbmQgSURBVS4KKyAqLwordm9pZCBzYXVfYW5kX2lkYXVfY2ZnKHZvaWQpOworCisvKioKKyAqIFxicmllZiBTZXRzIHRvIHNlY3VyZSB0aGUgaW5pdGlhbGl6ZWQgbm9uLXNlY3VyZSByZWdpb25zIG9mCisgKiAgICAgICAgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIENvbnRyb2xsZXIuCisgKi8KK3ZvaWQgbXBjX3JldmVydF9ub25fc2VjdXJlX3RvX3NlY3VyZV9jZmcodm9pZCk7CisKKyNlbmRpZiAvKiBfX1RBUkdFVF9DRkdfSF9fICovCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2hhbF9pc29sYXRpb24uYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90Zm1faGFsX2lzb2xhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmY0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2hhbF9pc29sYXRpb24uYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAyMC0yMDIxLCBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKgorICovCisKKyNpbmNsdWRlICJhcnJheS5oIgorI2luY2x1ZGUgImNtc2lzLmgiCisjaW5jbHVkZSAiRHJpdmVyX0NvbW1vbi5oIgorI2luY2x1ZGUgIm1taW9fZGVmcy5oIgorI2luY2x1ZGUgIm1wdV9hcm12OG1fZHJ2LmgiCisjaW5jbHVkZSAicmVnaW9uLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NmZy5oIgorI2luY2x1ZGUgInRmbV9oYWxfaXNvbGF0aW9uLmgiCisKKyNpbmNsdWRlICJ0Zm1fcGVyaXBoZXJhbHNfZGVmLmgiCisjaW5jbHVkZSAidGZtX2NvcmVfdXRpbHMuaCIKKyNpbmNsdWRlICJsb2FkL3BhcnRpdGlvbl9kZWZzLmgiCisjaW5jbHVkZSAibG9hZC9hc3NldF9kZWZzLmgiCisjaW5jbHVkZSAibG9hZC9zcG1fbG9hZF9hcGkuaCIKKworLyogSXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBNUFVfVFlQRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTVBVX1JFR0lPTl9OVU0gICAgICAgICAgICAgICAgICA4CisKKyNpZmRlZiBDT05GSUdfVEZNX0VOQUJMRV9NRU1PUllfUFJPVEVDVAorc3RhdGljIHVpbnQzMl90IG5fY29uZmlndXJlZF9yZWdpb25zID0gMDsKK3N0cnVjdCBtcHVfYXJtdjhtX2Rldl90IGRldl9tcHVfcyA9IHsgTVBVX0JBU0UgfTsKKworUkVHSU9OX0RFQ0xBUkUoTG9hZCQkTFIkJCwgTFJfVkVORUVSLCAkJEJhc2UpOworUkVHSU9OX0RFQ0xBUkUoTG9hZCQkTFIkJCwgTFJfVkVORUVSLCAkJExpbWl0KTsKK1JFR0lPTl9ERUNMQVJFKEltYWdlJCQsIFRGTV9VTlBSSVZfQ09ERSwgJCRSTyQkQmFzZSk7CitSRUdJT05fREVDTEFSRShJbWFnZSQkLCBURk1fVU5QUklWX0NPREUsICQkUk8kJExpbWl0KTsKK1JFR0lPTl9ERUNMQVJFKEltYWdlJCQsIFRGTV9BUFBfQ09ERV9TVEFSVCwgJCRCYXNlKTsKK1JFR0lPTl9ERUNMQVJFKEltYWdlJCQsIFRGTV9BUFBfQ09ERV9FTkQsICQkQmFzZSk7CitSRUdJT05fREVDTEFSRShJbWFnZSQkLCBURk1fQVBQX1JXX1NUQUNLX1NUQVJULCAkJEJhc2UpOworUkVHSU9OX0RFQ0xBUkUoSW1hZ2UkJCwgVEZNX0FQUF9SV19TVEFDS19FTkQsICQkQmFzZSk7CitSRUdJT05fREVDTEFSRShJbWFnZSQkLCBFUl9JTklUSUFMX1BTUCwgJCRaSSQkQmFzZSk7CitSRUdJT05fREVDTEFSRShJbWFnZSQkLCBFUl9JTklUSUFMX1BTUCwgJCRaSSQkTGltaXQpOworI2lmZGVmIFRGTV9TUF9NRVRBX1BUUl9FTkFCTEUKK1JFR0lPTl9ERUNMQVJFKEltYWdlJCQsIFRGTV9TUF9NRVRBX1BUUiwgJCRSVyQkQmFzZSk7CitSRUdJT05fREVDTEFSRShJbWFnZSQkLCBURk1fU1BfTUVUQV9QVFIsICQkUlckJExpbWl0KTsKKyNlbmRpZiAvKiBURk1fU1BfTUVUQV9QVFJfRU5BQkxFICovCisKK2NvbnN0IHN0cnVjdCBtcHVfYXJtdjhtX3JlZ2lvbl9jZmdfdCByZWdpb25fY2ZnW10gPSB7CisgICAgLyogVmVuZWVyIHJlZ2lvbiAqLworICAgIHsKKyAgICAgICAgMCwgLyogd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSB1c2luZyAqLworICAgICAgICAodWludDMyX3QpJlJFR0lPTl9OQU1FKExvYWQkJExSJCQsIExSX1ZFTkVFUiwgJCRCYXNlKSwKKyAgICAgICAgKHVpbnQzMl90KSZSRUdJT05fTkFNRShMb2FkJCRMUiQkLCBMUl9WRU5FRVIsICQkTGltaXQpLAorICAgICAgICBNUFVfQVJNVjhNX01BSVJfQVRUUl9DT0RFX0lEWCwKKyAgICAgICAgTVBVX0FSTVY4TV9YTl9FWEVDX09LLAorICAgICAgICBNUFVfQVJNVjhNX0FQX1JPX1BSSVZfVU5QUklWLAorICAgICAgICBNUFVfQVJNVjhNX1NIX05PTkUsCisjaWZkZWYgVEZNX1BYTl9FTkFCTEUKKyAgICAgICAgTVBVX0FSTVY4TV9QUklWX0VYRUNfT0sKKyNlbmRpZgorICAgIH0sCisgICAgLyogVEZNIENvcmUgdW5wcml2aWxlZ2VkIGNvZGUgcmVnaW9uICovCisgICAgeworICAgICAgICAwLCAvKiB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIHVzaW5nICovCisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgVEZNX1VOUFJJVl9DT0RFLCAkJFJPJCRCYXNlKSwKKyAgICAgICAgKHVpbnQzMl90KSZSRUdJT05fTkFNRShJbWFnZSQkLCBURk1fVU5QUklWX0NPREUsICQkUk8kJExpbWl0KSwKKyAgICAgICAgTVBVX0FSTVY4TV9NQUlSX0FUVFJfQ09ERV9JRFgsCisgICAgICAgIE1QVV9BUk1WOE1fWE5fRVhFQ19PSywKKyAgICAgICAgTVBVX0FSTVY4TV9BUF9ST19QUklWX1VOUFJJViwKKyAgICAgICAgTVBVX0FSTVY4TV9TSF9OT05FLAorI2lmZGVmIFRGTV9QWE5fRU5BQkxFCisgICAgICAgIE1QVV9BUk1WOE1fUFJJVl9FWEVDX09LCisjZW5kaWYKKyAgICB9LAorICAgIC8qIE5TUE0gUFNQICovCisgICAgeworICAgICAgICAwLCAvKiB3aWxsIGJlIHVwZGF0ZWQgYmVmb3JlIHVzaW5nICovCisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgRVJfSU5JVElBTF9QU1AsICQkWkkkJEJhc2UpLAorICAgICAgICAodWludDMyX3QpJlJFR0lPTl9OQU1FKEltYWdlJCQsIEVSX0lOSVRJQUxfUFNQLCAkJFpJJCRMaW1pdCksCisgICAgICAgIE1QVV9BUk1WOE1fTUFJUl9BVFRSX0RBVEFfSURYLAorICAgICAgICBNUFVfQVJNVjhNX1hOX0VYRUNfTkVWRVIsCisgICAgICAgIE1QVV9BUk1WOE1fQVBfUldfUFJJVl9VTlBSSVYsCisgICAgICAgIE1QVV9BUk1WOE1fU0hfTk9ORSwKKyNpZmRlZiBURk1fUFhOX0VOQUJMRQorICAgICAgICBNUFVfQVJNVjhNX1BSSVZfRVhFQ19ORVZFUgorI2VuZGlmCisgICAgfSwKKyAgICAvKiBSTyByZWdpb24gKi8KKyAgICB7CisgICAgICAgIDAsIC8qIHdpbGwgYmUgdXBkYXRlZCBiZWZvcmUgdXNpbmcgKi8KKyAgICAgICAgKHVpbnQzMl90KSZSRUdJT05fTkFNRShJbWFnZSQkLCBURk1fQVBQX0NPREVfU1RBUlQsICQkQmFzZSksCisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgVEZNX0FQUF9DT0RFX0VORCwgJCRCYXNlKSwKKyAgICAgICAgTVBVX0FSTVY4TV9NQUlSX0FUVFJfQ09ERV9JRFgsCisgICAgICAgIE1QVV9BUk1WOE1fWE5fRVhFQ19PSywKKyAgICAgICAgTVBVX0FSTVY4TV9BUF9ST19QUklWX1VOUFJJViwKKyAgICAgICAgTVBVX0FSTVY4TV9TSF9OT05FLAorI2lmZGVmIFRGTV9QWE5fRU5BQkxFCisjaWYgVEZNX0xWTCA9PSAxCisgICAgICAgIE1QVV9BUk1WOE1fUFJJVl9FWEVDX09LCisjZWxzZQorICAgICAgICBNUFVfQVJNVjhNX1BSSVZfRVhFQ19ORVZFUgorI2VuZGlmCisjZW5kaWYKKyAgICB9LAorICAgIC8qIFJXLCBaSSBhbmQgc3RhY2sgYXMgb25lIHJlZ2lvbiAqLworICAgIHsKKyAgICAgICAgMCwgLyogd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSB1c2luZyAqLworICAgICAgICAodWludDMyX3QpJlJFR0lPTl9OQU1FKEltYWdlJCQsIFRGTV9BUFBfUldfU1RBQ0tfU1RBUlQsICQkQmFzZSksCisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgVEZNX0FQUF9SV19TVEFDS19FTkQsICQkQmFzZSksCisgICAgICAgIE1QVV9BUk1WOE1fTUFJUl9BVFRSX0RBVEFfSURYLAorICAgICAgICBNUFVfQVJNVjhNX1hOX0VYRUNfTkVWRVIsCisgICAgICAgIE1QVV9BUk1WOE1fQVBfUldfUFJJVl9VTlBSSVYsCisgICAgICAgIE1QVV9BUk1WOE1fU0hfTk9ORSwKKyNpZmRlZiBURk1fUFhOX0VOQUJMRQorICAgICAgICBNUFVfQVJNVjhNX1BSSVZfRVhFQ19ORVZFUgorI2VuZGlmCisgICAgfSwKKyNpZmRlZiBURk1fU1BfTUVUQV9QVFJfRU5BQkxFCisgICAgLyogVEZNIHBhcnRpdGlvbiBtZXRhZGF0YSBwb2ludGVyIHJlZ2lvbiAqLworICAgIHsKKyAgICAgICAgMCwgLyogd2lsbCBiZSB1cGRhdGVkIGJlZm9yZSB1c2luZyAqLworICAgICAgICAodWludDMyX3QpJlJFR0lPTl9OQU1FKEltYWdlJCQsIFRGTV9TUF9NRVRBX1BUUiwgJCRSVyQkQmFzZSksCisgICAgICAgICh1aW50MzJfdCkmUkVHSU9OX05BTUUoSW1hZ2UkJCwgVEZNX1NQX01FVEFfUFRSLCAkJFJXJCRMaW1pdCksCisgICAgICAgIE1QVV9BUk1WOE1fTUFJUl9BVFRSX0RBVEFfSURYLAorICAgICAgICBNUFVfQVJNVjhNX1hOX0VYRUNfTkVWRVIsCisgICAgICAgIE1QVV9BUk1WOE1fQVBfUldfUFJJVl9VTlBSSVYsCisgICAgICAgIE1QVV9BUk1WOE1fU0hfTk9ORSwKKyNpZmRlZiBURk1fUFhOX0VOQUJMRQorICAgICAgICBNUFVfQVJNVjhNX1BSSVZfRVhFQ19ORVZFUgorI2VuZGlmCisgICAgfQorI2VuZGlmCit9OworI2VuZGlmIC8qIENPTkZJR19URk1fRU5BQkxFX01FTU9SWV9QUk9URUNUICovCisKK2VudW0gdGZtX2hhbF9zdGF0dXNfdCB0Zm1faGFsX3NldF91cF9zdGF0aWNfYm91bmRhcmllcyh2b2lkKQoreworI2lmZGVmIENPTkZJR19URk1fRU5BQkxFX01FTU9SWV9QUk9URUNUCisgICAgc3RydWN0IG1wdV9hcm12OG1fcmVnaW9uX2NmZ190IGxvY2FsY2ZnOworI2VuZGlmCisgICAgLyogU2V0IHVwIGlzb2xhdGlvbiBib3VuZGFyaWVzIGJldHdlZW4gU1BFIGFuZCBOU1BFICovCisgICAgc2F1X2FuZF9pZGF1X2NmZygpOworICAgIGlmIChtcGNfaW5pdF9jZmcoKSAhPSBURk1fUExBVF9FUlJfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gVEZNX0hBTF9FUlJPUl9HRU5FUklDOworICAgIH0KKyAgICBwcGNfaW5pdF9jZmcoKTsKKworICAgIC8qIFNldCB1cCBzdGF0aWMgaXNvbGF0aW9uIGJvdW5kYXJpZXMgaW5zaWRlIFNQRSAqLworI2lmZGVmIENPTkZJR19URk1fRU5BQkxFX01FTU9SWV9QUk9URUNUCisgICAgaW50MzJfdCBpOworCisgICAgbXB1X2FybXY4bV9jbGVhbigmZGV2X21wdV9zKTsKKworICAgIGlmIChBUlJBWV9TSVpFKHJlZ2lvbl9jZmcpID4gTVBVX1JFR0lPTl9OVU0pIHsKKyAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVnaW9uX2NmZyk7IGkrKykgeworICAgICAgICBzcG1fbWVtY3B5KCZsb2NhbGNmZywgJnJlZ2lvbl9jZmdbaV0sIHNpemVvZihsb2NhbGNmZykpOworICAgICAgICBsb2NhbGNmZy5yZWdpb25fbnIgPSBpOworICAgICAgICBpZiAobXB1X2FybXY4bV9yZWdpb25fZW5hYmxlKCZkZXZfbXB1X3MsCisgICAgICAgICAgICAoc3RydWN0IG1wdV9hcm12OG1fcmVnaW9uX2NmZ190ICopJmxvY2FsY2ZnKQorICAgICAgICAgICAgIT0gTVBVX0FSTVY4TV9PSykgeworICAgICAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICAgICAgfQorICAgIH0KKyAgICBuX2NvbmZpZ3VyZWRfcmVnaW9ucyA9IGk7CisKKyAgICBtcHVfYXJtdjhtX2VuYWJsZSgmZGV2X21wdV9zLCBQUklWSUxFR0VEX0RFRkFVTFRfRU5BQkxFLAorICAgICAgICAgICAgICAgICAgICAgIEhBUkRGQVVMVF9OTUlfRU5BQkxFKTsKKyNlbmRpZiAvKiBDT05GSUdfVEZNX0VOQUJMRV9NRU1PUllfUFJPVEVDVCAqLworCisgICAgcmV0dXJuIFRGTV9IQUxfU1VDQ0VTUzsKK30KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRmbV9oYWxfYmluZF9ib3VuZGFyaWVzKCkgb24gQ29yc3RvbmUtUG9sYXJpczoKKyAqCisgKiBUaGUgQVBJIGVuY29kZXMgc29tZSBhdHRyaWJ1dGVzIGludG8gYSBoYW5kbGUgYW5kIHJldHVybnMgaXQgdG8gU1BNLgorICogVGhlIGF0dHJpYnV0ZXMgaW5jbHVkZSBpc29sYXRpb24gYm91bmRhcmllcywgcHJpdmlsZWdlLCBhbmQgTU1JTyBpbmZvcm1hdGlvbi4KKyAqIFdoZW4gc2NoZWR1bGVyIHN3aXRjaGVzIHJ1bm5pbmcgcGFydGl0aW9ucywgU1BNIGNvbXBhcmVzIHRoZSBoYW5kbGUgYmV0d2VlbgorICogcGFydGl0aW9ucyB0byBrbm93IGlmIGJvdW5kYXJ5IHVwZGF0ZSBpcyBuZWNlc3NhcnkuIElmIHVwZGF0ZSBpcyByZXF1aXJlZCwKKyAqIFNQTSBwYXNzZXMgdGhlIGhhbmRsZSB0byBwbGF0Zm9ybSB0byBkbyBwbGF0Zm9ybSBzZXR0aW5ncyBhbmQgdXBkYXRlCisgKiBpc29sYXRpb24gYm91bmRhcmllcy4KKyAqLworZW51bSB0Zm1faGFsX3N0YXR1c190IHRmbV9oYWxfYmluZF9ib3VuZGFyaWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhcnRpdGlvbl9sb2FkX2luZm9fdCAqcF9sZGluZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwcF9ib3VuZGFyaWVzKQoreworICAgIHVpbnQzMl90IGksIGo7CisgICAgYm9vbCBwcml2aWxlZ2VkOworICAgIGNvbnN0IHN0cnVjdCBhc3NldF9kZXNjX3QgKnBfYXNzZXQ7CisgICAgc3RydWN0IHBsYXRmb3JtX2RhdGFfdCAqcGxhdF9kYXRhX3B0cjsKKyNpZiBURk1fTFZMID09IDIKKyAgICBzdHJ1Y3QgbXB1X2FybXY4bV9yZWdpb25fY2ZnX3QgbG9jYWxjZmc7CisjZW5kaWYKKyAgICBpZiAoIXBfbGRpbmYgfHwgIXBwX2JvdW5kYXJpZXMpIHsKKyAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICB9CisKKyNpZiBURk1fTFZMID09IDEKKyAgICBwcml2aWxlZ2VkID0gdHJ1ZTsKKyNlbHNlCisgICAgcHJpdmlsZWdlZCA9ICEhKHBfbGRpbmYtPmZsYWdzICYgUEFSVElUSU9OX01PREVMX1BTQV9ST1QpOworI2VuZGlmCisKKyAgICBwX2Fzc2V0ID0gKGNvbnN0IHN0cnVjdCBhc3NldF9kZXNjX3QgKilMT0FEX0lORk9fQVNTRVQocF9sZGluZik7CisKKyAgICAvKgorICAgICAqIFZhbGlkYXRlIGlmIHRoZSBuYW1lZCBNTUlPIG9mIHBhcnRpdGlvbiBpcyBhbGxvd2VkIGJ5IHRoZSBwbGF0Zm9ybS4KKyAgICAgKiBPdGhlcndpc2UsIHNraXAgdmFsaWRhdGlvbi4KKyAgICAgKgorICAgICAqIE5PVEU6IE5lZWQgdG8gYWRkIHZhbGlkYXRpb24gb2YgbnVtYmVyZWQgTU1JTyBpZiBwbGF0Zm9ybSByZXF1aXJlcy4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9sZGluZi0+bmFzc2V0czsgaSsrKSB7CisgICAgICAgIGlmICghKHBfYXNzZXRbaV0uYXR0ciAmIEFTU0VUX0FUVFJfTkFNRURfTU1JTykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHBhcnRpdGlvbl9uYW1lZF9tbWlvX2xpc3QpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChwX2Fzc2V0W2ldLmRldi5kZXZfcmVmID09IHBhcnRpdGlvbl9uYW1lZF9tbWlvX2xpc3Rbal0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChqID09IEFSUkFZX1NJWkUocGFydGl0aW9uX25hbWVkX21taW9fbGlzdCkpIHsKKyAgICAgICAgICAgIC8qIFRoZSBNTUlPIGFzc2V0IGlzIG5vdCBpbiB0aGUgYWxsb3dlZCBsaXN0IG9mIHBsYXRmb3JtLiAqLworICAgICAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICAgICAgfQorICAgICAgICAvKiBBc3N1bWUgUFBDICYgTVBDIHNldHRpbmdzIGFyZSByZXF1aXJlZCBldmVuIHVuZGVyIGxldmVsIDEgKi8KKyAgICAgICAgcGxhdF9kYXRhX3B0ciA9IFJFRkVSRU5DRV9UT19QVFIocF9hc3NldFtpXS5kZXYuZGV2X3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RhdGFfdCAqKTsKKworICAgICAgICBpZiAocGxhdF9kYXRhX3B0ci0+cGVyaXBoX3BwY19iYW5rICE9IFBQQ19TUF9ET19OT1RfQ09ORklHVVJFKSB7CisgICAgICAgICAgICBwcGNfY29uZmlndXJlX3RvX3NlY3VyZShwbGF0X2RhdGFfcHRyLT5wZXJpcGhfcHBjX2JhbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0X2RhdGFfcHRyLT5wZXJpcGhfcHBjX21hc2spOworICAgICAgICAgICAgaWYgKHByaXZpbGVnZWQpIHsKKyAgICAgICAgICAgICAgICBwcGNfY2xyX3NlY3VyZV91bnByaXYocGxhdF9kYXRhX3B0ci0+cGVyaXBoX3BwY19iYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdF9kYXRhX3B0ci0+cGVyaXBoX3BwY19tYXNrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBjX2VuX3NlY3VyZV91bnByaXYocGxhdF9kYXRhX3B0ci0+cGVyaXBoX3BwY19iYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdF9kYXRhX3B0ci0+cGVyaXBoX3BwY19tYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIFRGTV9MVkwgPT0gMgorICAgICAgICAvKgorICAgICAgICAgKiBTdGF0aWMgYm91bmRhcmllcyBhcmUgc2V0LiBTZXQgdXAgTVBVIHJlZ2lvbiBmb3IgTU1JTy4KKyAgICAgICAgICogU2V0dXAgcmVnaW9ucyBmb3IgdW5wcml2aWxlZ2VkIGFzc2V0cyBvbmx5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFwcml2aWxlZ2VkKSB7CisgICAgICAgICAgICBsb2NhbGNmZy5yZWdpb25fYmFzZSA9IHBsYXRfZGF0YV9wdHItPnBlcmlwaF9zdGFydDsKKyAgICAgICAgICAgIGxvY2FsY2ZnLnJlZ2lvbl9saW1pdCA9IHBsYXRfZGF0YV9wdHItPnBlcmlwaF9saW1pdDsKKyAgICAgICAgICAgIGxvY2FsY2ZnLnJlZ2lvbl9hdHRyaWR4ID0gTVBVX0FSTVY4TV9NQUlSX0FUVFJfREVWSUNFX0lEWDsKKyAgICAgICAgICAgIGxvY2FsY2ZnLmF0dHJfZXhlYyA9IE1QVV9BUk1WOE1fWE5fRVhFQ19ORVZFUjsKKyAgICAgICAgICAgIGxvY2FsY2ZnLmF0dHJfYWNjZXNzID0gTVBVX0FSTVY4TV9BUF9SV19QUklWX1VOUFJJVjsKKyAgICAgICAgICAgIGxvY2FsY2ZnLmF0dHJfc2ggPSBNUFVfQVJNVjhNX1NIX05PTkU7CisjaWZkZWYgVEZNX1BYTl9FTkFCTEUKKyAgICAgICAgICAgIGxvY2FsY2ZnLmF0dHJfcHhuID0gTVBVX0FSTVY4TV9QUklWX0VYRUNfTkVWRVI7CisjZW5kaWYKKyAgICAgICAgICAgIGxvY2FsY2ZnLnJlZ2lvbl9uciA9IG5fY29uZmlndXJlZF9yZWdpb25zKys7CisKKyAgICAgICAgICAgIGlmIChtcHVfYXJtdjhtX3JlZ2lvbl9lbmFibGUoJmRldl9tcHVfcywgJmxvY2FsY2ZnKQorICAgICAgICAgICAgICAgICE9IE1QVV9BUk1WOE1fT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVEZNX0hBTF9FUlJPUl9HRU5FUklDOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAqcHBfYm91bmRhcmllcyA9ICh2b2lkICopKCgodWludDMyX3QpcHJpdmlsZWdlZCkgJiBIQU5ETEVfQVRUUl9QUklWX01BU0spOworCisgICAgcmV0dXJuIFRGTV9IQUxfU1VDQ0VTUzsKK30KKworZW51bSB0Zm1faGFsX3N0YXR1c190IHRmbV9oYWxfdXBkYXRlX2JvdW5kYXJpZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwYXJ0aXRpb25fbG9hZF9pbmZvX3QgKnBfbGRpbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfYm91bmRhcmllcykKK3sKKyAgICBDT05UUk9MX1R5cGUgY3RybDsKKyAgICBib29sIHByaXZpbGVnZWQgPSAhISgodWludDMyX3QpcF9ib3VuZGFyaWVzICYgSEFORExFX0FUVFJfUFJJVl9NQVNLKTsKKworICAgIC8qIFByaXZpbGVnZWQgbGV2ZWwgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IGFsd2F5cyAqLworICAgIGN0cmwudyA9IF9fZ2V0X0NPTlRST0woKTsKKyAgICBjdHJsLmIublBSSVYgPSBwcml2aWxlZ2VkID8gMCA6IDE7CisgICAgX19zZXRfQ09OVFJPTChjdHJsLncpOworCisgICAgcmV0dXJuIFRGTV9IQUxfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90Zm1faGFsX3BsYXRmb3JtLmMgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2hhbF9wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTg4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2hhbF9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMjEsIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqCisgKi8KKworI2luY2x1ZGUgImNtc2lzLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NmZy5oIgorI2luY2x1ZGUgInRmbV9oYWxfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0Zm1fcGVyaXBoZXJhbHNfZGVmLmgiCisjaW5jbHVkZSAidWFydF9zdGRvdXQuaCIKKyNpbmNsdWRlICJkZXZpY2VfZGVmaW5pdGlvbi5oIgorCitlbnVtIHRmbV9oYWxfc3RhdHVzX3QgdGZtX2hhbF9wbGF0Zm9ybV9pbml0KHZvaWQpCit7CisgICAgZW51bSB0Zm1fcGxhdF9lcnJfdCBwbGF0X2VyciA9IFRGTV9QTEFUX0VSUl9TWVNURU1fRVJSOworICAgIGVudW0gc3lzY291bnRlcl9hcm12OF9tX2NudHJsX2Vycm9yX3QgY291bnRlcl9lcnIgPSBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX05PTkU7CisKKyAgICBwbGF0X2VyciA9IGVuYWJsZV9mYXVsdF9oYW5kbGVycygpOworICAgIGlmIChwbGF0X2VyciAhPSBURk1fUExBVF9FUlJfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gVEZNX0hBTF9FUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIHBsYXRfZXJyID0gc3lzdGVtX3Jlc2V0X2NmZygpOworICAgIGlmIChwbGF0X2VyciAhPSBURk1fUExBVF9FUlJfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gVEZNX0hBTF9FUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIHBsYXRfZXJyID0gaW5pdF9kZWJ1ZygpOworICAgIGlmIChwbGF0X2VyciAhPSBURk1fUExBVF9FUlJfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gVEZNX0hBTF9FUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIC8qIFN5c2NvdW50ZXIgZW5hYmxlZCBieSBkZWZhdWx0LiBUaGlzIHdheSBBcHAtUm9UIHBhcnRpdGlvbnMgY2FuIHVzZQorICAgICAqIHN5c3RpbWVycyB3aXRob3V0IHRoZSBuZWVkIHRvIGFkZCB0aGUgc3lzY291bnRlciBhcyBhbiBtbWlvIGRldmlkZS4KKyAgICAgKi8KKyAgICBjb3VudGVyX2VyciA9IHN5c2NvdW50ZXJfYXJtdjhfbV9jbnRybF9pbml0KCZTWVNDT1VOVEVSX0NOVFJMX0FSTVY4X01fREVWX1MpOworICAgIGlmIChjb3VudGVyX2VyciAhPSBTWVNDT1VOVEVSX0FSTVY4X01fRVJSX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICB9CisgICAgX19lbmFibGVfaXJxKCk7CisgICAgc3RkaW9faW5pdCgpOworCisgICAgcGxhdF9lcnIgPSBudmljX2ludGVycnVwdF90YXJnZXRfc3RhdGVfY2ZnKCk7CisgICAgaWYgKHBsYXRfZXJyICE9IFRGTV9QTEFUX0VSUl9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBURk1fSEFMX0VSUk9SX0dFTkVSSUM7CisgICAgfQorCisgICAgcGxhdF9lcnIgPSBudmljX2ludGVycnVwdF9lbmFibGUoKTsKKyAgICBpZiAocGxhdF9lcnIgIT0gVEZNX1BMQVRfRVJSX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFRGTV9IQUxfRVJST1JfR0VORVJJQzsKKyAgICB9CisKKyAgICByZXR1cm4gVEZNX0hBTF9TVUNDRVNTOworfQorCit2b2lkIHRmbV9oYWxfc3lzdGVtX3Jlc2V0KHZvaWQpCit7CisgICAgX19kaXNhYmxlX2lycSgpOworICAgIG1wY19yZXZlcnRfbm9uX3NlY3VyZV90b19zZWN1cmVfY2ZnKCk7CisKKyAgICBOVklDX1N5c3RlbVJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2ludGVycnVwdHMuYyBiL3BsYXRmb3JtL2V4dC90YXJnZXQvYXJtL21wczMvY29yc3RvbmVfcG9sYXJpcy90Zm1faW50ZXJydXB0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTBhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDIxLCBBcm0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNtc2lzLmgiCisjaW5jbHVkZSAic3BtX2lwYy5oIgorI2luY2x1ZGUgInRmbV9oYWxfaW50ZXJydXB0LmgiCisjaW5jbHVkZSAidGZtX3BlcmlwaGVyYWxzX2RlZi5oIgorI2luY2x1ZGUgImxvYWQvaW50ZXJydXB0X2RlZnMuaCIKKworc3RhdGljIHN0cnVjdCBpcnFfdCB0aW1lcjBfaXJxID0gezB9OworCit2b2lkIFRGTV9USU1FUjBfSVJRX0hhbmRsZXIodm9pZCkKK3sKKyAgICBzcG1faGFuZGxlX2ludGVycnVwdCh0aW1lcjBfaXJxLnBfcHQsIHRpbWVyMF9pcnEucF9pbGRpKTsKK30KKworZW51bSB0Zm1faGFsX3N0YXR1c190IHRmbV90aW1lcjBfaXJxX2luaXQodm9pZCAqcF9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpcnFfbG9hZF9pbmZvX3QgKnBfaWxkaSkKK3sKKyAgICB0aW1lcjBfaXJxLnBfaWxkaSA9IHBfaWxkaTsKKyAgICB0aW1lcjBfaXJxLnBfcHQgPSBwX3B0OworCisgICAgTlZJQ19TZXRQcmlvcml0eShURk1fVElNRVIwX0lSUSwgREVGQVVMVF9JUlFfUFJJT1JJVFkpOworICAgIE5WSUNfQ2xlYXJUYXJnZXRTdGF0ZShURk1fVElNRVIwX0lSUSk7CisgICAgTlZJQ19EaXNhYmxlSVJRKFRGTV9USU1FUjBfSVJRKTsKKworICAgIHJldHVybiBURk1fSEFMX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9leHQvdGFyZ2V0L2FybS9tcHMzL2NvcnN0b25lX3BvbGFyaXMvdGZtX3BlcmlwaGVyYWxzX2RlZi5oIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3RmbV9wZXJpcGhlcmFsc19kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ4ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vZXh0L3RhcmdldC9hcm0vbXBzMy9jb3JzdG9uZV9wb2xhcmlzL3RmbV9wZXJpcGhlcmFsc19kZWYuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE5LTIwMjEsIEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBDeXByZXNzIFNlbWljb25kdWN0b3IgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICoKKyAqLworCisjaWZuZGVmIF9fVEZNX1BFUklQSEVSQUxTX0RFRl9IX18KKyNkZWZpbmUgX19URk1fUEVSSVBIRVJBTFNfREVGX0hfXworCisjaW5jbHVkZSAicGxhdGZvcm1faXJxLmgiCisjaW5jbHVkZSAidGFyZ2V0X2NmZy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBRdWFudGl6ZWQgZGVmYXVsdCBJUlEgcHJpb3JpdHksIHRoZSB2YWx1ZSBpczoKKyAqIChOdW1iZXIgb2YgY29uZmlndXJhYmxlIHByaW9yaXR5KSAvIDQ6ICgxVUwgPDwgX19OVklDX1BSSU9fQklUUykgLyA0CisgKi8KKyNkZWZpbmUgREVGQVVMVF9JUlFfUFJJT1JJVFkgICAgKDFVTCA8PCAoX19OVklDX1BSSU9fQklUUyAtIDIpKQorCisjZGVmaW5lIFRGTV9USU1FUjBfSVJRICAgICAgICAgICAoVElNRVIwX0lSUW4pCisKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGF0YV90IHRmbV9wZXJpcGhlcmFsX3N0ZF91YXJ0OworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kYXRhX3QgdGZtX3BlcmlwaGVyYWxfdGltZXIwOworCisjZGVmaW5lIFRGTV9QRVJJUEhFUkFMX1NURF9VQVJUICAoJnRmbV9wZXJpcGhlcmFsX3N0ZF91YXJ0KQorI2RlZmluZSBURk1fUEVSSVBIRVJBTF9USU1FUjAgICAgKCZ0Zm1fcGVyaXBoZXJhbF90aW1lcjApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1RGTV9QRVJJUEhFUkFMU19ERUZfSF9fICovCg==